【问题标题】:Seg Fault when calling enQueue function in a Queue在队列中调用 enQueue 函数时出现 Seg Fault
【发布时间】:2020-07-13 10:28:37
【问题描述】:

我的 enQueue 函数中存在分段错误,我不明白它为什么存在(除了我正在访问我不允许访问的内存这一事实)。

我的 enQueue 函数旨在在链表的头部插入一个节点。我的deQueue函数是为了遍历链表,删除链表的尾部。

以下是相关的结构:

typedef struct studstruct{
  int age;
  struct studstruct *nextPtr;
}Student;

typedef struct linkedlist{
  Student *head, *tail;
}StudentList;

这是我的主要功能:

int main(void){
  StudentList *myQueue=initQueue();
  int tracker;

  tracker=enQueue(myQueue, 4);
  printf("Enqueue returned: %d\n", tracker);
  tracker=enQueue(myQueue, 3);
  printf("Enqueue returned: %d\n", tracker);
  tracker=enQueue(myQueue, 2);
  printf("Enqueue returned: %d\n", tracker);
  tracker=enQueue(myQueue, 1);
  printf("Enqueue returned: %d\n", tracker);

  printf("After enqueue:\n");
  printList(myQueue);

  (myQueue->head)=deQueue(myQueue);

  printf("After dequeue:\n");
  printList(myQueue);

  freeList(myQueue);
}

这是我的 enQueue 函数:

int enQueue(StudentList *node,int data){
  Student *newNode;
  newNode = createStudentNode(data);
  newNode->nextPtr=node->head;

  if(node->head==newNode->nextPtr){
    return 1;
  }
  else{
    return -1;
  }
}

这是我的 deQueue 函数:

Student* deQueue(StudentList *node){
  Student *temp=node->head;
  Student *temp2;

  while(temp->nextPtr!=NULL){
    temp2=temp;
    temp=temp->nextPtr;
  }
  free(temp2->nextPtr);
  temp2->nextPtr=NULL;

  return node->head;
}

这是我的 createNode 函数,它为我的节点动态分配内存:

Student *createStudentNode(int data){
  Student *node;
  node = (Student *)malloc(sizeof(Student));
  if(node){
    node->nextPtr=NULL;
    node->age=data;
  }
  return node;
}

【问题讨论】:

  • 在enQueue() 中,node 不是节点,而是指向列表“base”的指针,因此名称有点晦涩:但无论如何:您是否应该设置 @ 987654328@ 和/或 node->tail ?顺便说一句,enQueue() 是打算追加还是前置?而deQueue()似乎没有考虑node->head可能是NULL的可能性,但也可能应该设置node->head和/或node->tail?
  • 使用调试器并查看故障线可以立即解决此类问题,我强烈推荐它。

标签: c stack queue


【解决方案1】:

如果您预先附加,则忘​​记更改 StudentList 的新头,如果您后附加,则忘​​记更改尾

int enQueue(StudentList *node,int data){
  Student *newNode;
  newNode = createStudentNode(data);
  newNode->nextPtr = node->head;
  node->head = newNode;

  if(node->head==newNode->nextPtr){
    return 1;
  }
  else{
    return -1;
  }
}

【讨论】:

    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多