2016-12-19 11 views
2

リンクリストで作業していたので、挿入機能を作成しました。リストは学生の名前とスコアを含むファイルから作成され、ソートされた方法で、最初の試行では新しいノードが挿入されますが、2番目の試行では新しいノードがヌルまたはノードを指す代わりにそのノードを指すようになります前に挿入された。最初の試行では起こらないうちに、ノードが自分自身を指し示す行がどこにあるのかを見つけることができないようです。ここでリンクされたリスト: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; 
} 

は、第1および第2のインサートの両方で出力されます: -

//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の使用を取り除くとうまくいくはずです。挿入コードが正しいようです。

p.s .:使用されていないので、insertedも削除してください。


愚かヌール...エラーがあなたのケース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

私はprevとinsertを削除しましたが、まだ変更はありません@ paul-ogilvie –

+0

コードの残りの部分には、corectのように見えるものがなければなりません。 –

関連する問題