2016-12-04 15 views
0

最終的な完全なプログラムは以下のリンクの下にあります。私に答えるすべての人に感謝します。 http://pastebin.com/1Qrs11JEリンクされたリスト新しいノードの追加問題

質問:

私はC言語でのリンクリストで迷惑な問題を持っている

は、プログラムを完了しました。私は明日提出する必要がある宿題があります。私は昨日からこの問題を解決しようとしていましたが、できませんでした。私は問題がリンクされたリストに新しいノードを追加していると思うが、リンクされたリストのレコードを見ようとするとエラーが出る。私は意味の結果に直面しており、プログラムはエラーで終了します。

以下のリンクで、よりわかりやすいコードをご覧いただけます。 リンク:ここhttp://pastebin.com/Ugtue6JT

が私のコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <malloc.h> 

// structure definition 
struct node { 
char name[50]; 
int age; 
int student_no; 
char nationality[50]; 
struct node *next; 
}; 
typedef struct node *NODE_T; 

// function declarations 
void enter_new_data(); 
void remove_existing_data(); 
void display_all_data(); 
void show_options(); 
NODE_T getnode(); 
void freenode(NODE_T p); 
void free_buffer(); 
void continue_f(char message[100]); 

// global variables 
char ch; 

// create linked-list's main holder variable 
NODE_T students,conductor; 

int main(){ 

// allocate memory for the node link-list holder 
students = NULL; 
//students->next = 0; // initialize next to 0 for first node of linked-list 

// show the options that user has 
show_options(); 

return 1; 
} 

// this function will list options that user can apply 
void show_options(){ 

system("cls"); // clear screen 

int opt,opt_bool=0; 

printf("%s\n\n%s\n%s\n%s\n%s\n\n","The Options You Have","1. Add New Student's Record","2. Delete An Existing Student's Record","3. Display The List Of Students","4. Exit"); 


while(opt_bool != 1){ 
    printf("Operation: "); 
    scanf("%d",&opt); 

    if(opt == 1 || opt == 2 || opt == 3 || opt == 4){ 
     opt_bool = 1; 
    } 

} 

// check the operation and go to the operation 
if(opt == 1){ // adding record 
    enter_new_data(); 
} else if(opt == 2){ // removing record 

} else if(opt == 3){ // displaying records 
    display_all_data(); 
} else if(opt == 4){ // exit the program 
    exit(0); 
} 
} 

// enter new student data into linked-list 
void enter_new_data(){ 

system("cls"); // clear screen 

// get a new node 
NODE_T p = getnode(); 

printf("You are entering a new student's record\n"); 

// take student's name 
printf("Student's Name: "); 
scanf("%s",p->name); 
free_buffer(); 

// take student's age 
printf("Student's Age: "); 
scanf("%d",&p->age); 
free_buffer(); 

// take student's number 
printf("Student's Number: "); 
scanf("%d",&p->student_no); 
free_buffer(); 

// take student's nationality 
printf("Student's Nationality: "); 
scanf("%s",p->nationality); 
free_buffer(); 

// set p->next next value of last node of linked-list, which is equal to 0 
p->next = 0; 

printf("%s, %d, %d, %s",p->name,p->age,p->student_no,p->nationality); 


// if there is no any node yet, add node p as first node 
if(students == NULL) { 
    students = p; 
} else { 

    conductor = students; // assign linked-list to the conductor to traverse 

    // reach the last node 
    while (conductor->next != 0) 
    { 
     conductor = conductor->next; 
    } 

    conductor->next = p; // append the node p to the linked list 
} 

freenode(p); // set free node p 

continue_f("Adding new record is done."); // ask press any key to continue 

show_options(); // show options 

} 

// to display all data of linked list 
void display_all_data(){ 

system("cls"); // clear screen 

printf("The Student Records\n\n"); 

printf("%s%7s%18s%15s","STUDENT'S NAME","AGE","STUDENT NUMBER","NATIONALITY"); // captions 

freenode(conductor); 
conductor = getnode(); 
conductor = students; // assign linked-list to the conductor to traverse 

if (conductor != NULL) { /* Makes sure there is a place to start */ 
    // traverse untill last node 
    while (conductor->next != 0) 
    { 

     printf("\n%s%7d%18d%15s",conductor->name,conductor->age,conductor->student_no,conductor->nationality); // record 

     conductor = conductor->next; 
    } 
    } else { 
    printf("\n\n There is not any record yet."); 
    } 

    continue_f("Listing records is done."); // ask press any key to continue 

    show_options(); // show options 
} 

// create new node 
NODE_T getnode(void){ 
    NODE_T p; 
    p = (struct node *) malloc(sizeof(struct node)); 
    return p; 
} 

// set free a node 
void freenode(NODE_T p){ 
    free(p); 
} 

// clear the buffer if there are any extra data in it 
void free_buffer(){ 
    while (getchar() != '\n') { } 
} 

void continue_f(char message[100]){ 
    printf("\n\n%s\nPress any key to continue...",message); 
    getch(); // wait for pushing any key from user 
} 
+0

http:// stackoverflow。com/help/mcve – melpomene

+0

」と「」は標準ヘッダーではありません。 – melpomene

+0

@melpomene: '[mcve]'タグを使用してください:) –

答えて

2

提供されたソースコードを見て、チェックした後、リンクされたリスト内のノードのmalloc()/free()の誤解による複数の問題があります。

  1. リンクリストにノードを追加するために割り当てられたノードへのポインタを使用する場合、それが割り当てられるものとし、前
  2. を初期化する、いずれもそのポインタを割り当てまたは遊離、
  3. に追加されたノードリンクされたリストは、それを削除した後、またはリンクされたリストが削除されたときにのみ解放することができます。 1

    エラー:enter_new_data()で、予期しないfreenode(p);

は、それらの規則に続き、ここで検出されたエラーです。

ノードpはリンクされています...解放しないでください。

// if there is no any node yet, add node p as first node 
if(students == NULL) { 
    students = p; 
} 
else { 
    conductor = students; // assign linked-list to the conductor to traverse 
    // reach the last node 
    while (conductor->next != NULL) 
    { 
     conductor = conductor->next; 
    } 
    conductor->next = p; // append the node p to the linked list 
} 
// NO !!!! 
freenode(p); // set free node p 

エラー2display_all_data()で、conductorの予想外の自由/ malloc関数。

変数conductorは、リンクリスト(割り当てられていない) を調べるために使用される一時ポインタに過ぎません。

// NO !!!! 
freenode(conductor); 
// NO !!!! 
conductor = getnode(); 

conductor = students; // assign linked-list to the conductor to traverse 

if (conductor != NULL) { /* Makes sure there is a place to start */ 

エラー3display_all_data()でマイナーエラー、すべての項目にリンクされたリストを使用ノードのポインタの代わりに、次のポインタを探索します。

テストによって最後の項目も調べてください。(conductor != NULL)

while (conductor != NULL) //->next != 0) 
    { 
     printf("\n%s%7d%18d%15s",conductor->name,conductor->age, 
      conductor->student_no,conductor->nationality); // record 
     conductor = conductor->next; 
    } 
+0

答えがありがとう私は今日10時30分までに完了しなければならない別の宿題を完了しなければならなかった、今日私は8時間クラスの後にPCを得るときにチェックする。しかし、フリーノードやその他のポイントを使用してはいけない理由がわかりました。 –

+0

こんにちは、タンクはあまりにも@J。完璧な答えのPiquard、私はポインタを知っている私は新しいノードと間違った方法で考えていた。とにかく、それはあなたのおかげで、適切に動作しています。 –

+0

@AydınBulut、あなたのソースコード 'if(opt == 2){//レコードを削除する}に1つの関数がありません。ノードを削除することは、構造体ポインタとLinked-Listで非常に有効です。 –