請問關於C語言的linked list(資料鏈結)

我想要寫一個能夠輸入多筆資料(不必依大小排序)並且能夠顯示出來,

可是卻都無法正常執行(單向鏈結)

以下是我的程式碼:

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

/* 創造一個串列並儲存學生資料 */

struct student{

char data[10];

struct student *nextnode;

};

void title(void);

void insert(struct student *sPtr,char input[10]);

void print(struct student *currentPtr);

int main(int argc, char *argv[]) {

int choice=0;/*輸入選項*/

char value[10];

struct student *headPtr = NULL;

title();/*顯示標頭*/

printf("<提示>輸入1以輸入學生資料,輸入2以顯示學生資料,3為結束\n");

scanf("%d",&choice);

while(choice!=3){

switch (choice){

/*輸入1時為輸入學生資料*/

case 1:

printf("請輸入學號:");

scanf("\n%10s",value);

printf("head 原本指向 %p\n",headPtr);

insert(&headPtr,value);

printf("head insert後指向 %p\n",headPtr);

break;

/*輸入2時顯示學生資料*/

case 2:

system("cls");

title();

printf(" 學號\n");

printf("====================================\n");

print(headPtr);

break;

default:

printf("\n輸入錯誤!!");

break;

}

}

printf("====================================\n");

printf("   程 式 執 行 結 束 \n");

printf("====================================\n");

return 0;

}

void title(void){

printf(" 學生資料管理系統\n");

printf("====================================\n");

}

void insert(struct student *sPtr,char input[10]){

struct student *newPtr;

struct student *lastPtr;

newPtr = (struct student *)malloc(sizeof(struct student));

sPtr->nextnode = NULL;

if(newPtr != NULL){

*newPtr->data = input;

newPtr->nextnode = NULL;

lastPtr = NULL;

if(sPtr->nextnode == NULL){/*第一筆資料*/

sPtr->nextnode = newPtr;

newPtr = sPtr;

}

else{/*第一筆以後*/

newPtr->nextnode = lastPtr;

lastPtr = newPtr;

sPtr->nextnode = newPtr;

newPtr = sPtr;

}

printf("newPtr 指向 %p\n",newPtr);

printf("head 傳入insert指向 %p\n",sPtr);

}

else{

printf("\n記憶體取得失敗!!");

}

}

已更新項目:

void print(struct student *currentPtr){

if(currentPtr == NULL){

printf("\n無資料");

}

else{

while(currentPtr != NULL){

printf("%s\n",currentPtr->data);

currentPtr = currentPtr->nextnode;

}

}

}

2 個已更新項目:

關於上述的程式碼

Q1 執行後選1 會看到headPtr執行完insert後記憶體位置依舊沒變

Q2 insert中的判斷是否為第一筆資料請問寫法是否正確

Q3 請問一下如果第一筆資料為1,第二筆為2,第三筆為3

資料鏈結狀態是否為我的描述這樣?

第一次輸入

headPtr->newPtr(data = 1,nextnode = NULL)

第二次輸入

headPtr->newPtr(data = 2,nextnode = lastPtr)->lastPtr(data = 1,nextnode = NULL)

3 個已更新項目:

第三次輸入

headPtr->newPtr(data = 3,nextnode = lastPtr)->lastPtr(data=2,nextnode = 第一筆資料)->第一筆(data = 1 , nextnode = NULL)

9 個解答

評分
  • 翔翔
    Lv 7
    6 年前
    最佳解答

    Abstraction

    使用C語言簡單的實現linked list,並用C++的std::vector實作出相同的功能作比較。Introduction

    學習資料結構,第一個要學的就是linked list,本文示範最簡單的linked list實現,包含建立與顯示,可把它當成linked list的標準範本,畢竟步驟都差不多。一個基本的問題:為什麼需要linked list?若要將大量資料存到記憶體,你會想到什麼?第一個想到的就是array,但C語言是個靜態語言,array必須事先宣告大小,這樣compiler才能進行最佳化,若到時候沒用這麼多記憶體,就白白浪費記憶體了。或許你會說array可以配合malloc()變成動態array,但前提是你必須告訴malloc()要建立多大的array,若連要建立多大的陣列也不確定,而是在run-time看有多少資料就建立多大,這時連malloc()的動態array也不能用了,此時就得靠linked list。linked list是資料結構的基礎,基本上就是靠struct如火車車廂那樣連在一起,run-time有需要時,在動態掛一個struct上去。C語言1 /*

    2 (C) OOMusou 2008 http://oomusou.cnblogs.com

    3

    4 Filename : DS_linked_list_simple.c

    5 Compiler : Visual C++ 8.0

    6 Description : Demo how to use malloc for linked list

    7 Release : 03/22/2008 1.0

    8 */

    9 #include <stdio.h>

    10 #include <stdlib.h>

    11 #include <string.h>

    12

    13 #define SLEN 255

    14

    15 struct list {

    16 int no;

    17 char name[SLEN];

    18 struct list *next;

    19 };

    20

    21 int main() {

    22 int no;

    23 char s[255];

    24

    25 struct list *head = NULL;

    26 struct list *current = NULL;

    27 struct list *prev = NULL;

    28

    29 while(1) {

    30 printf("No. = ");

    31 scanf("%d", &no);

    32

    33 if (no == 0)

    34 break;

    35

    36 printf("Name = ");

    37 scanf("%s", s);

    38

    39 current = (struct list *)malloc(sizeof(struct list));

    40 if (current == NULL)

    41 exit(EXIT_FAILURE);

    42

    43 current->next = NULL;

    44

    45 current->no = no;

    46 strncpy(current->name, s, SLEN -1);

    47 current->name[SLEN -1] = '\0';

    48

    49 if (head == NULL)

    50 head = current;

    51 else

    52 prev->next = current;

    53

    54 prev = current;

    55 }

    56

    57 // display linked list

    58 current = head;

    59 while(current != NULL) {

    60 printf("No. = %d, Name = %s\n", current->no, current->name);

    61 current = current->next;

    62 }

    63

    64 // free linked list

    65 current = head;

    66 while(current != NULL) {

    67 prev = current;

    68 current = current->next;

    69 free(prev);

    70 }

    71 }

    執行結果No. = 1

    Name = clare

    No. = 2

    Name = jessie

    No. = 0

    No. = 1, Name = clare

    No. = 2, Name = jessie

    15行struct list {

    int no;

    char name[SLEN];

    struct list *next;

    };

    更詳細資料到下列網站:

    http://www.cnblogs.com/oomusou/archive/2008/03/22/...

  • 6 年前

    參考下面的網址看看

    http://phi008780520.pixnet.net/blog

  • 6 年前

    參考下面的網址看看

    http://phi008780520.pixnet.net/blog

  • 匿名使用者
    6 年前

    參考下面的網址看看

    http://phi008780520.pixnet.net/blog

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 匿名使用者
    6 年前

    參考下面的網址看看

    http://phi008780508.pixnet.net/blog

  • ㄚ旺
    Lv 5
    6 年前

    答案就在時間中......

    發問時間:2014-05-17 09:29:49

    回答時間:2014-05-17 09:33:42

    4分鐘搞定所有的答案.用龜頭想都不可能.

  • 6 年前

    糟糕了!一等要被升等成為半等了!

    2014-05-17 23:40:52 補充:

    > (不必依大小排序)

    既然不必排序,為神不都插在頭上上呢?

    唯一的問題是-第一隻學生你要怎插?

  • 6 年前

    回答者1的

    : 連要建立多大的陣列也不確定,而是在run-time看有多少資料就建立多大,

    : 這時連malloc()的動態array也不能用了,此時就得靠linked list。

    這是錯誤的說法,

    malloc()的就是用在run-time時才知道需要多大的動態陣列,

    不然你以為C++的std::vector如何一直成長.

    請不要亂教新手.

  • 匿名使用者
    6 年前

    >這里很不錯aaashops。com老婆很喜歡

    博勉呷凷

還有問題?馬上發問,尋求解答。