Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 双链表分段错误向后打印_C_File_Doubly Linked List - Fatal编程技术网

C 双链表分段错误向后打印

C 双链表分段错误向后打印,c,file,doubly-linked-list,C,File,Doubly Linked List,我试图删除一个特定位置的节点,但我不断得到一个分段错误11 我正在从文件中读取位置和值 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct node { float val; struct node *prev; struct node *next; }node_t; void printForward(node_t *head) {

我试图删除一个特定位置的节点,但我不断得到一个分段错误11

我正在从文件中读取位置和值

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node {
  float val;
  struct node *prev;
  struct node *next;
}node_t;

void printForward(node_t *head) {
  node_t *current = head;

  while (current != NULL) {
    printf("%.2f\n", current->val);
    current = current->next;
  }
}

void printBackward(node_t *head) {
  node_t *current = head;

  while (current->next != NULL) {
    current = current->next;
  }

  while (current != NULL) {
    printf("%.2f\n", current->val);
    current = current->prev;
  }
}


void deleteAtPos(node_t **head, int pos) {
  int i;
  node_t *current = *head;
  node_t *temp = NULL;

  if (pos == 0) {
    temp = (*head)->next;
    free(*head);
    (*head) = temp;
    (*head)->prev = NULL;
    return;
  }

    for (i = 0; i < (pos - 1); i++) {
      if (current->next != NULL) {
        current = current->next;
      }
    }

      temp = current->next;
      current->next = temp->next;
      free(temp);
}


// Fix insert at position
void insertAtPos(node_t **head, int pos, float val) {
  int i;
  node_t *newNode = malloc(sizeof(node_t));
  node_t *current = *head;
  newNode->val = val;

  if (pos == 0) {
    newNode->next = (*head);
    newNode->prev = NULL;
    (*head)->prev = newNode;
    (*head) = newNode;
    return;
  }

  for (i = 0; i < pos; i++) {
    if (current->next != NULL) {
      current = current->next;
    }
    else {
      printf("Node does not exist\n");
      break;
    }
  }

  current->prev->next = newNode;
  newNode->prev = current->prev;
  newNode->next = current;
  current->prev = newNode;
}

void addEnd(node_t **head, float val) {
  node_t *current = *head;
  node_t *newNode = malloc(sizeof(node_t));
  newNode->next = NULL;
  newNode->val = val;

  if (*head == NULL) {
    *head = newNode;
    newNode->prev = NULL;
    return;
  }

  while (current->next != NULL) {
    current = current->next;
  }
  current->next = newNode;
  newNode->prev = current;
}

int main(int argc, char *argv[]) {
  if (argc != 2) {
    printf("Error");
  }

  node_t *head = NULL;

  FILE *fp;
  int i = 0, x;
  float valLine1, valLine2, valLine3;
  char buffer[200], *token, *del = ",";
  float posVals[200], delPos[200];
  fp = fopen(argv[1], "r");

  fgets(buffer, sizeof(buffer), fp);
    token = strtok(buffer, del);
    while (token != NULL) {
      valLine1 = atof(token);
      addEnd(&head, valLine1);
      token = strtok(NULL, del);
    }

    printForward(head);
    printf("\n");


    del = ":,";
    fgets(buffer, sizeof(buffer), fp);
    token = strtok(buffer, del);
    while (token != NULL) {
      valLine2 = atof(token);
      posVals[i] = valLine2;
      token = strtok(NULL, del);
      i++;
    }

    for (x = 0; x < i; x += 2) {
      insertAtPos(&head, posVals[x + 1], posVals[x]);
    }
    printForward(head);

    fgets(buffer, sizeof(buffer), fp);
    i = 0;
    token = strtok(buffer, del);
    while (token != NULL) {
      valLine3 = atof(token);
      delPos[i] = valLine3;
      token = strtok(NULL, del);
      i++;
    }
    printf("\n");


    for (x = 0; x < i; x++) {
      deleteAtPos(&head, delPos[x]);
    }



    printForward(head);
    printf("\n");
    printBackward(head);

    fclose(fp);


}
以下是该文件的内容:

17,32.5,12,0,34.6,-200.1,17,0.04,24
1:2,4.1:5,-12:4
3,5,0
请帮忙


谢谢

您是说问题出在
deleteAtPos
上。但是您的代码离SSCCE很远,所以我不想为您隔离问题-您应该这样做,并且大多数情况下,在隔离过程中,您会找到答案。如果没有,你可以把问题贴在这里

因此,我将列出我所能看到的关于
deleteAtPos
的错误,如果您修复了所有这些错误,问题将消失

  • 您没有处理
    *head
    为空的情况,列表中有0个元素。这肯定是个错误

  • 您没有检查
    pos>=0

  • 您也没有正确处理列表中只有一个元素的情况。另一个断层

  • 您没有正确处理
    pos
    是列表末尾的情况。另一个断层


  • 您是说问题在于
    deleteAtPos
    。但是您的代码离SSCCE很远,所以我不想为您隔离问题-您应该这样做,并且大多数情况下,在隔离过程中,您会找到答案。如果没有,你可以把问题贴在这里

    因此,我将列出我所能看到的关于
    deleteAtPos
    的错误,如果您修复了所有这些错误,问题将消失

  • 您没有处理
    *head
    为空的情况,列表中有0个元素。这肯定是个错误

  • 您没有检查
    pos>=0

  • 您也没有正确处理列表中只有一个元素的情况。另一个断层

  • 您没有正确处理
    pos
    是列表末尾的情况。另一个断层


  • 我已经修改了deleteAtPos()函数,现在您可以在任何位置删除,您的backward()函数将打印正确的值

    void deleteAtPos(node_t **head, int pos) {
      int i;
      node_t *current = *head;
      node_t *temp = NULL;    
    
      if (pos == 0) {
        temp = (*head)->next;
        free(*head);
        (*head) = temp;
        (*head)->prev = NULL;
        return;
      }
    
        for (i = 0; i < (pos - 1); i++) {
          if (current->next != NULL) {
            current = current->next;
          }
        }
    
    
        temp = current;
        if(current->next==NULL)
        {
            current->prev->next = current->next;
        }
        else
        {
            current->prev->next = current->next;
            current->next->prev = current->prev;
        }
    
        free(temp);
    }
    
    void deleteAtPos(节点头,内部位置){
    int i;
    节点_t*当前=*头部;
    节点温度=NULL;
    如果(位置==0){
    温度=(*头部)->下一步;
    自由(*头);
    (*水头)=温度;
    (*head)->prev=NULL;
    返回;
    }
    对于(i=0;i<(位置-1);i++){
    如果(当前->下一步!=NULL){
    当前=当前->下一步;
    }
    }
    温度=电流;
    如果(当前->下一步==NULL)
    {
    当前->上一个->下一个=当前->下一个;
    }
    其他的
    {
    当前->上一个->下一个=当前->下一个;
    当前->下一个->上一个=当前->上一个;
    }
    免费(临时);
    }
    
    我已经修改了deleteAtPos()函数,现在您可以在任何位置删除,您的backward()函数将打印正确的值

    void deleteAtPos(node_t **head, int pos) {
      int i;
      node_t *current = *head;
      node_t *temp = NULL;    
    
      if (pos == 0) {
        temp = (*head)->next;
        free(*head);
        (*head) = temp;
        (*head)->prev = NULL;
        return;
      }
    
        for (i = 0; i < (pos - 1); i++) {
          if (current->next != NULL) {
            current = current->next;
          }
        }
    
    
        temp = current;
        if(current->next==NULL)
        {
            current->prev->next = current->next;
        }
        else
        {
            current->prev->next = current->next;
            current->next->prev = current->prev;
        }
    
        free(temp);
    }
    
    void deleteAtPos(节点头,内部位置){
    int i;
    节点_t*当前=*头部;
    节点温度=NULL;
    如果(位置==0){
    温度=(*头部)->下一步;
    自由(*头);
    (*水头)=温度;
    (*head)->prev=NULL;
    返回;
    }
    对于(i=0;i<(位置-1);i++){
    如果(当前->下一步!=NULL){
    当前=当前->下一步;
    }
    }
    温度=电流;
    如果(当前->下一步==NULL)
    {
    当前->上一个->下一个=当前->下一个;
    }
    其他的
    {
    当前->上一个->下一个=当前->下一个;
    当前->下一个->上一个=当前->上一个;
    }
    免费(临时);
    }
    
    检查最后一个节点的逻辑。您将把值设置为Null,当前->下一步=临时->下一步。这是错误的是的,我也这么认为,我尝试了许多不同的方法,但我不能使它工作。实际上,我正试图将列表向后打印,这就是一直给我seg错误的原因。我是否需要在我的删除函数中对prev执行任何操作?为什么不在需要删除的节点之前停止循环?因为你必须这么做。也要维护上一个指针,或者只需复制下一个节点的内容,并对该节点而不是特定节点进行delate。检查上一个节点的逻辑。您将把值设置为Null,当前->下一步=临时->下一步。这是错误的是的,我也这么认为,我尝试了许多不同的方法,但我不能使它工作。实际上,我正试图将列表向后打印,这就是一直给我seg错误的原因。我是否需要在我的删除函数中对prev执行任何操作?为什么不在需要删除的节点之前停止循环?因为你必须这么做。也可以维护上一个指针,或者只复制下一个节点的内容,并对该节点而不是特定节点进行数据挖掘。