2016-12-19 7 views
2

Я работал над связанным списком, и я должен был сделать функцию вставки. Список создается из файла, содержащего имя и оценку ученика, и в порядке сортировки, с первой попытки я вставляю новый узел, это нормально, но вторая попытка делает новый узел указывать на себя, а не указывать на нуль или на узел в который он был вставлен раньше. Я не могу найти, где строка, которая заставляет узел указывать на себя, пока это не происходит с первой попытки!Связанный список: Вставить точки функции в себя после второй вставки

typedef struct student 
{ 
    char name[20]; 
    int score;  
    struct student *next; 
} Student_Data_Type; 

Student_Data_Type *insert(Student_Data_Type *head, Student_Data_Type *p) 
{ 
    if(head == NULL)//if the head is empty then create list 
    { 
     head = Readfromfile(head); 
    } 
    Student_Data_Type *bufferStack = head; 
    Student_Data_Type *prev; 
    prev = malloc(sizeof(Student_Data_Type)); 
    bool inserted = false; 
    while(bufferStack->next != NULL && 
     strcmp(bufferStack->next->name, p->name) < 0) 

    { 
     bufferStack = bufferStack->next; 
    } 
    p->next = bufferStack->next; 
    bufferStack->next = p; 
    printf("[####] ADDED %s %d\n",bufferStack->next->name, bufferStack->next->score);//Second try says pointing to the same node 
    prev = bufferStack->next; 
    printf("[##] AND IS POINTING TO %s %d\n", prev->next->name, prev->next->score); 
    inserted = true; 
    return head; 
} 

Вот выход как в первом и второй вставке: -

//This is the initial list created from the file 
[###] DISPLAYING NAMES AND SCORE OF STUDENTS:- 
[###] ChenZhiheng <-----> 67 
[###] GaoSuxiang <-----> 89 
[###] MaQianli <-----> 90 
[###] ZhangCheng <-----> 95 
1.create list(read from file) 
2.display all records 
3.insert a record 
4.delete a record 
5.query 
0.exit 

//INSERT ONE 
[###]ENTER NAME PLZ: Noor 
[###] ENTER SCORE: 88 
[####] ADDED Noor 88 
[##] AND IS POINTING TO ZhangCheng 95 
1.create list(read from file) 
2.display all records 
3.insert a record 
....... 

//NOW DISPLAYING THE LIST AFTER INSERTING:- 
[###] DISPLAYING NAMES AND SCORE OF STUDENTS:- 
[###] ChenZhiheng <-----> 67 
[###] GaoSuxiang <-----> 89 
[###] MaQianli <-----> 90 
[###] Noor <-----> 88 
[###] ZhangCheng <-----> 95 
1.create list(read from file) 
...... 
//THEN THE SECOND INSERT TRY 
[###]ENTER NAME PLZ: Layla 
[###] ENTER SCORE: 90 
[####] ADDED Layla 90 
[##] AND IS POINTING TO MaQianli 90 
1.create list(read from file) 
...... 
//THEN I CALL MY DISLAY FUNCTION AGAIN AND THIS IS THE OUTPUT: 
[###] DISPLAYING NAMES AND SCORE OF STUDENTS:- 
[###] ChenZhiheng <-----> 67 
[###] GaoSuxiang <-----> 89 
[###] Layla <-----> 90 
[###] MaQianli <-----> 90 
[###] Layla <-----> 90 
[###] MaQianli <-----> 90 
[###] Layla <-----> 90 
[###] MaQianli <-----> 90 
[###] Layla <-----> 90 
[###] MaQianli <-----> 90 
....AND FOREVER LOOP,... 

//HERE IS MY DISPLAY FUNCTION 
void DisplayAll(Student_Data_Type *head) 
{ 
Student_Data_Type *stackbuffer = head; 
printf("[###] DISPLAYING NAMES AND SCORE OF STUDENTS:- \n"); 
while(stackbuffer != NULL) 
    { 
    printf("[###] %s <-----> %d\n", stackbuffer->name, stackbuffer->score); 
    stackbuffer = stackbuffer->next; 
} 

} 

ответ

2

Вашей все prev неиспользованные и использование malloc для нее расходуется память. В своем заявлении printf вы используете prev, который на самом деле является вашим оригиналом p, поэтому prev->next является вашим оригиналом bufferStack->next, который может быть пустым или может быть чем-то другим, чего вы не намерены делать.

Поскольку ваш код стоит сейчас, удалите любое использование prev, и оно должно работать. Ваш код ввода кажется правильным.

р.с .: также удалить inserted как не использовался.


Глупый Noor ... Ошибка в части вы не показали нам, ваш случай 3:

int main() 
{ 
Student_Data_Type *head,*p; 
    ... 
    case 3:  
      ... 
      strcpy(p->name, Student_Insert); /// <-- copy where???? 
      p->score = Score_Insert; 
      head = insert(head, p); 
      break; 

Теперь, где память для p выделяется ??? Вам повезло, что вы не получили ошибку сегментации, поскольку p не инициализирован (он инициализирован, но это потому, что вы сначала сделали запрос или так).

+0

Я уточню вопрос для получения дополнительной информации об ошибке. –

+0

Я удалил превью и вставке, все равно никаких изменений @ paul-ogilvie –

+0

Должно быть что-то не так в остальной части вашего кода, поскольку он вставляет, кажется, corect. –