程式題目
撰寫一個linked list(連結串列)
程式範例1
/*the filename: main *the filename extension: .c */ #include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; } N; typedef struct a { int b; //b是用來記錄串列長度 N *head; //head為一指標變數,用來指向連結串列之起始節點 } L; int main(){ L *myList; myList = (L *) malloc(sizeof(L)); creatList(myList); insertFirstList(myList, 72); insertFirstList(myList, 39); insertFirstList(myList, 9); insertFirstList(myList, 23); printList(myList); return 0; } void creatList(L *listHead) { //類似建構子(constructor) listHead->b = 0; listHead->head = NULL; } void insertFirstList(L *listHead, int data){ N *pNew; pNew = (N *) malloc(sizeof(N)); pNew->data = data; pNew->next = listHead->head; listHead->head = pNew; listHead->b++; } void printList(L *listHead){ N *curr; if (listHead->head != NULL){ printf("the total count = %d\n", listHead->b); for (curr = listHead->head; curr != NULL; curr = curr->next){ //curr = listHead->head:把curr的指標變數儲存listHead->head的位置 // printf("%d\n", listHead->head); //curr = listHead->next:把curr的指標變數儲存listHead->next的位置 // printf("%d\n", curr->next); printf("%d\n", curr->data); } } else{ printf("the list is empty\n"); } }
<說明>
for loop:
- 何謂串列?
有次序排列的資料稱為串列。
- 何謂連結串列?
由動態記憶體配置節點(Node)串接而成。
與陣列的最大差別是:它的各元素之間的記憶體位置是不連續的、隨機(Random)的,不像陣列是規規矩矩的由0開始編號下去,所以這也是連結串列的一個缺點,當各位想要找取第n個串列的資料時,它必須從頭開始去找,而不能像陣列一樣直接指定讀取某個陣列內的元素(ex.a[n])。
- 何謂節點(Node)?
程式碼基本結構:
typedef struct node { int data; //用以儲存節點資料內容 struct node *next; //用以紀錄下一個節點的記憶體位置 } N;
- 以圖說明本程式的運作架構:
- code instruction:
L *myList;
creatList(myList);
void creatList(L *listHead) { //類似建構子(constructor) listHead->b = 0; listHead->head = NULL; }
insertFirstList(myList, 72);
void insertFirstList(L *listHead, int data){ N *pNew; pNew = (N *) malloc(sizeof(N)); pNew->data = data; pNew->next = listHead->head; listHead->head = pNew; listHead->b++; }
insertFirstList(myList, 39);
insertFirstList(myList, 9);
insertFirstList(myList, 23);
void printList(L *listHead){ N *curr; if (listHead->head != NULL){ printf("the total count = %d\n", listHead->b); for (curr = listHead->head; curr != NULL; curr = curr->next){ //curr = listHead->head:把curr的指標變數儲存listHead->head的位置 // printf("%d\n", listHead->head); //curr = listHead->next:把curr的指標變數儲存listHead->next的位置 // printf("%d\n", curr->next); printf("%d\n", curr->data); } } else{ printf("the list is empty\n"); } }第52行code:
for loop:
程式範例2
使用ADT(抽象資料型別, Abstract Data Type)的技巧來撰寫本程式
<寫法一>
/*the filename: main *the filename extension: .c */ #include <stdio.h> #include <stdlib.h> #include "list.h" int main(){ L *myList; myList = (L *) malloc(sizeof(L)); creatList(myList); insertFirstList(myList, 72); insertFirstList(myList, 39); insertFirstList(myList, 9); insertFirstList(myList, 23); printList(myList); }
/*the filename: list *the filename extension: .h */ #ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED typedef struct n { int data; struct n *link; } N; typedef struct a { int b; N *head; } L; void creatList(L *listHead); void insertFirstList(L *listHead, int data); void printList(L *listHead); void creatList(L *listHead) { listHead->b = 0; listHead->head = NULL; } void insertFirstList(L *listHead, int data){ N *pNew; pNew = (N *) malloc(sizeof(N)); pNew->data = data; pNew->link = listHead->head; listHead->head = pNew; listHead->b++; } void printList(L *listHead){ N *curr; if (listHead->head != NULL){ printf("the total count = %d\n", listHead->b); for (curr = listHead->head; curr != NULL; curr = curr->link){ //curr = listHead->head:把curr的指標變數儲存listHead->head的位置 // printf("%d\n", listHead->head); //curr = listHead->link:把curr的指標變數儲存listHead->link的位置 // printf("%d\n", curr->link); printf("%d\n", curr->data); } } else{ printf("the list is empty\n"); } } #endif // LIST_H_INCLUDED
<寫法二>
/*the filename: main *the filename extension: .c */ #include <stdio.h> #include <stdlib.h> #include "list.h" int main(){ L *myList; myList = (L *) malloc(sizeof(L)); creatList(myList); insertFirstList(myList, 72); insertFirstList(myList, 39); insertFirstList(myList, 9); insertFirstList(myList, 23); printList(myList); }
/*the filename: list *the filename extension: .h */ #ifndef LIST_H_INCLUDED #define LIST_H_INCLUDED typedef struct n { int data; struct n *link; } N; typedef struct a { int b; N *head; } L; void creatList(L *listHead); void insertFirstList(L *listHead, int data); void printList(L *listHead); #endif // LIST_H_INCLUDED
/*the filename: list_implement *the filename extension: .c */ #include <stdio.h> #include <stdlib.h> #include "list.h" void creatList(L *listHead) { listHead->b = 0; listHead->head = NULL; } void insertFirstList(L *listHead, int data){ N *pNew; pNew = (N *) malloc(sizeof(N)); pNew->data = data; pNew->link = listHead->head; listHead->head = pNew; listHead->b++; } void printList(L *listHead){ N *curr; if (listHead->head != NULL){ printf("the total count = %d\n", listHead->b); for (curr = listHead->head; curr != NULL; curr = curr->link){ //curr = listHead->head:把curr的指標變數儲存listHead->head的位置 // printf("%d\n", listHead->head); //curr = listHead->link:把curr的指標變數儲存listHead->link的位置 // printf("%d\n", curr->link); printf("%d\n", curr->data); } } else{ printf("the list is empty\n"); } }如果以上範例都理解了以後,以下這個題目相信已經難不倒各位了:
Supposedly, there is an ADT “List” contains
two parts: “list.h” and “listImpl.c”. Further, there is an APP which uses ADT “List”
and listed below. Use a C program to implement “listImpl.c”. (from ccu Bo)
list.h
|
The main function of App
|
typedef struct node {
int data;
struct node *link;
} NODE;
typedef struct list {
int count;
struct node *head;
} LIST;
void creatList(LIST *listHead);
void insertFirstList(LIST *listHead, int
data);
void printList(LIST *listHead);
|
….
int main(){
LIST *myList;
NODE *pNew, *pNew1;
myList = (LIST *) malloc(sizeof(LIST));
creatList(myList);
insertFirstList(myList, 72);
insertFirstList(myList, 39);
printList(myList);
}
|
沒有留言:
張貼留言