1. 程式人生 > 其它 >C語言單鏈表操作

C語言單鏈表操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
typedef int ElemType;

typedef struct Lnode{
	ElemType data;
	struct Lnode * next;
}LNode, * LinkList;

/*
	連結串列初始化 
*/
void InitList_L(LinkList L){
	L = (LinkList)malloc(sizeof(LNode));
	if(L == NULL)exit(-1);
	L->next = NULL;
}

/*
	判斷連結串列是否為空 
*/
bool ListEmpty(LinkList L){
	if(L->next == NULL) return true;
	return false;
}

/*
	銷燬單鏈表 
*/
void DestoryList_L(LinkList L){
	LinkList p;
	while(L){
		p = L;
		L = L->next;
		free(p);
	}
}

/*
	清空單鏈表 
*/ 
void ClearList_L(LinkList L){
	LinkList p, q;
	p = L->next;
	while(p){
		q = p->next;
		free(p);
		p = q;
	}
	L->next = NULL;
}

/*
	求單鏈表L的長度 
*/
int ListLength_L(LinkList L){
	int len = 0;
	LinkList p;
	p = L->next;
	while(p){
		p = p->next;
		len++;
	}
	return len;
}

/*
	取值:取單鏈表中第i個元素的內容 
*/
int  GetElem_L(LinkList L, int i, ElemType * e){
	LinkList p;
	p = L->next;
	int j = 1;
	while(p && i > j){
		p = p->next;
		j++;
	}
	if(!p || j > i ) return -1;
	*e = p->data;
	return 1;
}
/*
	查詢:按值查詢:根據指定資料獲取資料所在位置(地址) 
*/
LinkList LocateElem_L(LinkList L, ElemType e){
	LinkList p;
	p = L->next;
	while(p && p->data != e){
		p = p->next;
	}
	return p;
}

/*
	查詢:按值查詢:根據指定資料獲取資料所在位置(序號)
*/
int LocateElem_L2(LinkList L, ElemType e){
	LinkList p;
	p = L->next;
	int j = 1;
	while(p && p->data != e){
		p = p->next;
		j++;
	}
	if(p)return j;
	else return 0;
}

/*
	插入:在第i後結點插入新結點 
*/
int ListInsert_L(LinkList L, int i, ElemType e){
	LinkList p;
	p = L;
	int j = 0;
	while(p && i-1 > j){
		p = p->next;
		j++;
	}
	if(!p || j > i - 1) return -1;
	LinkList s = (LinkList)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return 1;
}

/*
	單鏈表的建立:頭插法 
*/
LinkList CreateList_H(){
	int len;
	int val;
	LinkList L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	printf("請輸入您要生成的連結串列節點個數:len=");
	scanf("%d", &len);
	int i;
	for(i = 0; i < len; i++){		
		printf("請輸入第%d個節點的值:", i + 1);
		scanf("%d", &val);
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = val;
		p->next = L->next;
		L->next = p;
	}
	return L;
} 

/*
	單鏈表的建立:尾插法 
*/
LinkList CreateList_R(){
	LinkList L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	int len; 
	printf("請輸入您要生成的連結串列節點個數:len=");
	scanf("%d", &len);
	int i;
	LinkList r = L;
	int val;
	for(i = 0; i < len; i++){		
		printf("請輸入第%d個節點的值:", i + 1);
		scanf("%d", &val);
		LinkList p = (LinkList)malloc(sizeof(LNode));
		p->data = val;
		p->next = NULL;
		r->next = p;
		r = p;
	}
	return L;
}

/*
	刪除:刪除第i個結點 
*/
int ListDelete_L(LinkList L, int i, ElemType * e){
	LinkList p;
	p = L;
	int j = 0;
	while(p && j < i - 1){
		p = p->next;
		j++;
	}
	if(!p || j > i - 1) return -1;
	LinkList q;
	q = p->next;
	p->next = q->next;
	*e = q->data;
	free(q);
	return 1;
} 

/*
	連結串列的遍歷 
*/
void traverse_list(LinkList L){
	LinkList p;
	p = L->next;
	while(p){
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
	return;
}
int main(){
	LinkList L;
	/***************頭插法建立連結串列*************************/
	//L = CreateList_H();
	/***************尾插法建立連結串列*************************/
	L = CreateList_R(); 
	/***************銷燬單鏈表*************************/
	//DestoryList_L(L); 
	/***************清空單鏈表 *************************/
	//ClearList_L(L);
	/***************求單鏈表的長度*************************/
	//printf("表長為:%d\n", ListLength_L(L));
	/*****取值:取單鏈表中第i個元素的內容,取到的放到e中 ****/
	/*
	ElemType e; 
	GetElem_L(L, 3, &e);
	printf("e = %d\n", e);	
	*/
	/*****查詢:按值查詢:根據指定資料獲取資料所在位置(地址)****/
	//LocateElem_L(L, 3);
	/*****查詢:按值查詢:根據指定資料獲取資料所在位置(序號)****/
	//printf("Locate = %d", LocateElem_L2(L, 45));	
	/***************求插入:在第i後結點前插入新結點***********************/
	 
	//printf("-----before------\n");
	//traverse_list(L);
	//ListInsert_L(L, 4, 999);//i等於0在第i之後插入,i等於1在i之前插入 
	//printf("-----after------\n");
	//traverse_list(L);
	//	-----before------
	//	23 43 56 67 87
	//	-----after------
	//	23 43 56 999 67 87
	//printf("ListEmpty = %d", ListEmpty(L)); //判斷單鏈表是否為空
	int e;	
	ListDelete_L(L, 3, &e);
	traverse_list(L);
	return 0;
} 
我亦無他,惟手熟爾