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

2014-05-17 5:29 pm
我想要寫一個能夠輸入多筆資料(不必依大小排序)並且能夠顯示出來,
可是卻都無法正常執行(單向鏈結)

以下是我的程式碼:

#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記憶體取得失敗!!");
}
}
更新1:

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)

2014-05-17 5:33 pm
✔ 最佳答案

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/1117686.html
2014-06-01 10:19 am
參考下面的網址看看

http://phi008780520.pixnet.net/blog
2014-05-29 12:14 pm
參考下面的網址看看

http://phi008780520.pixnet.net/blog
2014-05-23 3:50 pm
參考下面的網址看看

http://phi008780520.pixnet.net/blog
2014-05-20 7:55 pm
參考下面的網址看看

http://phi008780508.pixnet.net/blog
2014-05-18 8:49 pm
答案就在時間中......

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

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

4分鐘搞定所有的答案.用龜頭想都不可能.
2014-05-18 7:29 am
糟糕了!一等要被升等成為半等了!

2014-05-17 23:40:52 補充:
> (不必依大小排序)
既然不必排序,為神不都插在頭上上呢?
唯一的問題是-第一隻學生你要怎插?
2014-05-17 9:13 pm
回答者1的
: 連要建立多大的陣列也不確定,而是在run-time看有多少資料就建立多大,
: 這時連malloc()的動態array也不能用了,此時就得靠linked list。

這是錯誤的說法,
malloc()的就是用在run-time時才知道需要多大的動態陣列,
不然你以為C++的std::vector如何一直成長.

請不要亂教新手.
2014-05-17 6:45 pm
>這里很不錯aaashops。com老婆很喜歡
博勉呷凷


收錄日期: 2021-04-30 18:50:45
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20140517000010KK04455

檢視 Wayback Machine 備份