Ошибка сегмента при вызове функции enQueue в очереди - PullRequest
0 голосов
/ 01 апреля 2020

В моей функции 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;
}

1 Ответ

1 голос
/ 01 апреля 2020

вы забыли сменить новый заголовок 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;
  }
}

...