不帶頭節點連結清單 (初始化,插入,删除,查找,顯示,毀鍊)
#include<stdio.h>
#include<stdlib.h>
#define boolean unsigned char
typedef struct LINK {
int data;
struct LINK *next;
}LINK;
LINK* creatOnePNode();
boolean initialization(LINK **hp);
boolean showLink(LINK **hp);
boolean destoryLink(LINK **hp);
LINK* searchLink(LINK **hp,LINK *searchNode);
boolean insertLink(LINK **hp);
boolean deleteLink(LINK **hp);
boolean deleteLink(LINK **hp) {
LINK *searchNode = creatOnePNode();
int searchData;
LINK *pre;
LINK *p;
printf("\n請輸入要删除的資料(若不存在删除無效):");
scanf("%d", &searchData);
searchNode->data = searchData;
pre = searchLink(hp,searchNode);
if(hp && *hp){
if (NULL == pre) {
p = *hp;
*hp = (*hp)->next;
free(p);
} else if (pre->next) {
p = pre->next;
pre->next = p->next;
free(p);
} else {
printf("删除無效!\n");
}
free(searchNode);
return 0;
} else {
return -1;
}
}
boolean insertLink(LINK **hp) {
LINK *inputNode = creatOnePNode();
LINK *searchNode = creatOnePNode();
int inputData;
int searchData;
LINK *pre;
printf("\n請輸入要插入的資料(左插入):");
scanf("%d", &inputData);
inputNode->data = inputData;
printf("請輸入要插入的位置(若資料不存在則在末尾加上):");
scanf("%d", &searchData);
searchNode->data = searchData;
pre = searchLink(hp,searchNode);
if (hp && *hp) {
if (NULL == pre) {
inputNode->next = *hp;
*hp = inputNode;
} else if (NULL == pre->next) {
pre->next = inputNode;
} else {
inputNode->next = pre->next;
pre->next = inputNode;
}
free(searchNode);
return 0;
} else {
return -1;
}
}
LINK* searchLink(LINK **hp,LINK *searchNode) {
LINK *p;
LINK *q = NULL;
if(hp && *hp) {
for (p = *hp; p && p->data != searchNode->data; p = p->next){
q = p;
}
return q;
//q == NUll(為首節點)
//q != NUll(為中間節點或末節點)
} else {
return -1;
}
}
boolean destoryLink(LINK **hp) {
LINK *p = *hp;
LINK *tmp;
if(hp && *hp) {
while (p && p->next) {
tmp = p;
p = p->next;
free(tmp);
}
*hp = NULL;
hp = NULL;
printf("\n銷毀成功!\n");
return 0;
} else {
return -1;
}
}
boolean showLink(LINK **hp) {
LINK *p;
if(hp && *hp){
for(p = *hp; p; p = p->next) {
printf("%d ", p->data);
}
return 0;
} else {
printf("此鍊不存在或空!\n");
return -1;
}
}
boolean initialization(LINK **hp) {
LINK *p;
LINK *tail;
int data;
printf("請輸入要寫入的資料(以0結束):");
scanf("%d", &data);
if (hp){
while (data) {
p = creatOnePNode();
p->data = data;
if (NULL == *hp) {
*hp= p;
} else {
tail->next = p;
}
tail = p;
printf("請輸入要寫入的資料(以0結束):");
scanf("%d", &data);
}
return 0;
} else {
return -1;
}
}
LINK* creatOnePNode() {
return (LINK*)calloc(1,sizeof(LINK));
}
int main () {
LINK *list = NULL;
initialization(&list);
showLink(&list);
insertLink(&list);
showLink(&list);
deleteLink(&list);
showLink(&list);
destoryLink(&list);
showLink(&list);
return 0;
}