順序表相比,鏈表增強了數據間的連接,一個接一個,發現July的博客比較深層次,還是打好基礎再了解更深一層的東西。
還是分LinkList.h,LinkList.c,main.c
之前匆匆忙忙趕東西時,就copy一大段改改就交了。自己重寫後發現諸多問題在這一塊裡。
LinkList.h
<SPAN style="FONT-SIZE: 18px">#include<stdio.h> #include<malloc.h> typedef int DataType; typedef struct SimpleLinkList *Node; struct SimpleLinkList{ DataType info; Node link; } ; typedef struct SimpleLinkList *LinkList; LinkList CreateNUllList(); int isNull(LinkList linklist); int insertPost(LinkList linklist,Node node,DataType element); int insertBack(LinkList linklist,Node node,DataType element); int printList(LinkList linklist); Node searchElement(LinkList linklist,DataType element); DataType showValue(LinkList linklist,Node node); int deleteElement(LinkList linklist,DataType element); LinkList combine(LinkList one,LinkList another); </SPAN>
<SPAN style="FONT-SIZE: 18px">#include "LinkList.h" LinkList CreateNUllList(){ LinkList linklist = (LinkList)malloc(sizeof(struct SimpleLinkList)); if(linklist != NULL) linklist -> link = NULL; else printf("create fail!"); return linklist; } int isNull(LinkList linklist){ return (linklist != NULL); // not null return 1 } int insertPost(LinkList linklist,Node node,DataType element){ Node temp = (Node)malloc(sizeof(struct SimpleLinkList)); // 前插 注意如果沒有任何元素 那麼把頭結點指向 element if(temp == NULL){ printf("insert fail"); return 0; }else{ for(linklist;linklist!= NULL; linklist = linklist -> link) { if(linklist -> link == node){ temp ->info = element; linklist ->link = temp; temp ->link = node; } } } return 1; //前插的節點 是要我們自己傳參注意 而不是把函數寫成 } // insert forward //帶頭節點的鏈表 頭結點沒有值 // 其實 所謂的後插 是後插 但是現在的node是 鏈表 實際插入的時候 //所以 node的link是第一個數 所謂變成“前插” int insertBack(LinkList linklist,Node node,DataType element){ Node temp = (Node)malloc(sizeof(struct SimpleLinkList)); if(temp == NULL){ printf("insert element fail!"); return 0; } temp -> info = element; temp -> link = node -> link; node -> link = temp; return 1; } //insert back int printList(LinkList linklist){ if(linklist == NULL){ printf("it is null"); return 0; } while(linklist -> link != NULL){ printf("%2d",linklist->link->info); linklist = linklist -> link ; } printf("\n"); return 1; } Node searchElement(LinkList linklist,DataType element){ Node node; if(linklist == NULL){ printf("the element was not found"); return NULL; } node = linklist -> link; while(node != NULL && node -> info != element){ node = node -> link; } if(node == NULL){ return NULL; } return node; } DataType showValue(LinkList linklist,Node node){ Node temp; if(linklist == NULL){ printf("the element was not found"); return NULL; } temp = linklist -> link; while(temp != NULL && temp -> link != node){ temp = temp -> link; } return node; } int deleteElement(LinkList linklist,DataType element){ Node node; Node temp; if(linklist == NULL){ printf("the element you deleted was not found"); return 0; } node = linklist ; while(node ->link!= NULL && node ->link-> info != element){ // link 的info 是element之前。 node = node -> link; // printf("test\n");link ->info 先要判斷link為不為空! } // printf("test2"); if(node->link== NULL ){ printf("the element you deleted was not found\n"); return 0; } else { temp = node->link; node -> link = temp -> link; free(temp); printf("the element is deleted\n"); return 1; } } LinkList combine(LinkList one,LinkList another){ //終於知道錯在哪裡 節點沒有分配 根本就不存在 數據結構就是數據結構 //原本是空的 malloc一個節點 插進去 //問題二: one ->link!= NULL 這是對的 while(one!= NULL) //當one 為null了 也就沒有link了 怎麼 malloc 新的東西都是沒用的。 Node temp ; LinkList linken; linken = one; while(one ->link!= NULL) one = one ->link; for(another;another->link!= NULL; another = another ->link){ temp = (Node)malloc(sizeof(struct SimpleLinkList)); temp ->info = another ->link ->info; temp ->link = another ->link ->link; one ->link = temp; one = one ->link; } return linken; // linken 臨時指向頭節點 能返回整個表 } </SPAN>
<SPAN style="FONT-SIZE: 18px">#include "LinkList.h" int main(){ int i,element; LinkList linklist1 = CreateNUllList(); LinkList linklist2 = CreateNUllList(); LinkList linklist3 = CreateNUllList(); Node note = linklist1; Node note2 = linklist1; //if(note != NULL) printf("yes"); for(i = 0;i<10;i++){ while(note != NULL) note = note -> link; insertPost(linklist1, note,i); }//終於完成 前插 使得 for(i = 0;i<10;i++){ insertBack(linklist2, linklist2,i); } //printf("%d",linklist->link->info); printList(linklist1); printList(linklist2); /* printf("input the value of the element you search\n"); scanf("%d",&element); if(searchElement(linklist1,element) == NULL) printf("not found"); for(i=0;note2 != searchElement(linklist1,element);note2 = note2 ->link,i++ ) ;//空語句 不執行 if(searchElement(linklist1,element) == NULL) printf("not found\n"); else printf("%d is the %dth element of the linklist\n",element,i); printf("input the value of the element you delete\n"); // scanf("%d",&element); //deleteElement(linklist1,element); // printList(linklist1); */ linklist3 = combine(linklist1,linklist2); printList(linklist3); return 0; } </SPAN>