順序表相比,鏈表增強了數據間的連接,一個接一個,發現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>