天天看點

不帶頭節點連結清單

不帶頭節點連結清單 (初始化,插入,删除,查找,顯示,毀鍊)

#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;
	
} 
           

繼續閱讀