c語言單連結串列的實現,包括連結串列的建立、插入、查詢、刪除、列印、長度計算

SkyInTheLimit發表於2020-11-25
#include <stdio.h>
#include <stdlib.h> 

typedef struct node{
	char data;
	struct node *next;
}LINKLIST;

//  連結串列初始化操作,返回一個空連結串列 
LINKLIST *INITLIST()
{
	LINKLIST *head;
	head = (LINKLIST*)malloc(sizeof(LINKLIST));
	head->next = NULL;
	return head;
} 
//  連結串列的建立1(尾插入法建立連結串列,就是從連結串列的直接尾部新增資料用指標連起來)
LINKLIST *rCreate()
{
	LINKLIST *head,*last,*p;
	char ch;
	head = (LINKLIST*)malloc(sizeof(LINKLIST));
	head->next = NULL;
	last = head;
	printf("請輸入連結串列數值(尾插入法),@符號終止輸入:\n");
	while((ch = getchar()) != '@')
	{
//		接收到@字元時跳出迴圈 
		p = (LINKLIST*)malloc(sizeof(LINKLIST));
		p->data	= ch;
		last->next = p;
		last = p;//重新對last賦值 
		p->next = NULL;//到尾了 
	} 
	return head;
}
//   連結串列的建立2(頭插入法建立連結串列,每一個資料都是直接插入在head的後面,然後將後面的資料後移,有點像堆疊,先進後出) 
LINKLIST *hCreate()
{
	LINKLIST *head,*p;
	char ch;
	head = (LINKLIST*)malloc(sizeof(LINKLIST));
	head->next = NULL;
	printf("請輸入連結串列數值(頭插入法),@符號終止輸入:\n");
	while((ch = getchar()) != '@')
	{
		p = (LINKLIST*)malloc(sizeof(LINKLIST));
		p->data = ch;
		p->next = head->next;//讓head第一次指向的元素向後移動一個單位 
		head->next = p;//head指向的下一個就是p 
	}
	return head;
} 
//  計算連結串列的長度
int LENGTH(LINKLIST *head)
{
//	注意這個地方,傳入的head的是結構指標
//  改變結構指標裡面東西是不會像原來改變整數一樣改變原來的head內容的(這裡的p有點像是區域性變數,不會改變head) 
	int i = 0;
	LINKLIST *p = head;
	while(p = p->next)
		i++;
	return i;
} 
//   尋找連結串列裡的第n個節點(n>=1),其實就是獲得第n個之後的連結串列 
LINKLIST *GET(LINKLIST *head,int n)
{
	LINKLIST *p = head;
	int i = 1;
	while(i<=n&&p)
	{
		p = p->next;
		i++;	
	}	
	return p;
} 
//    根據使用者輸入的節點data值尋找節點
LINKLIST *LOCATE(LINKLIST *head,char data)
{
	LINKLIST *p = head->next;
	while(p&&(p->data!=data))
		p = p->next;
	return p;//這裡的p最終指向的已經是NULL了,沒找到不用賦值直接返回 
} 
//   插入操作,輸入一個n,在n-1位置插入(類似於陣列的插入,但是此處n>=2) 
void INSERT(LINKLIST *head,int n,char data)
{
	LINKLIST *inserted,*p;
	inserted = (LINKLIST*)malloc(sizeof(LINKLIST));//給要插入的節點malloc 
	inserted->next = NULL;
	inserted->data = data;
	p = GET(head,n-1);//查詢插入元素的前一位數 
	if(p)
	{
//		找到了該節點,開始插入
		inserted->next = p->next;
		p->next = inserted;
		printf("insert successful!\n");
	}else{
		printf("insert fail\n");
	}
} 

//      刪除第n個元素
void DELETE(LINKLIST *head,int n)
{
	LINKLIST *p,*q;
	p = GET(head,n-1);//獲取到要刪除的前一位元素 
	if(p&&p->next)
	{
		q = p->next;
		p->next = q->next;
		free(q);
		printf("delete success\n");
	}else{
		printf("delete fail\n");
	}
}
//  判斷連結串列是否為空
int isEmpty(LINKLIST *head)
{
	if(head->next)
		return 1;
	return 0;
} 
//  單連結串列的列印
void listPrint(LINKLIST *head) 
{
	LINKLIST *p;
	p = head->next;
	if(!p){
		printf("連結串列有誤!請檢查後再列印\n");
		return; 
	}
	while(p){
		printf("%c->",p->data);
		p = p->next;
	}
	printf("\n");
}

int main()
{
//	LINKLIST *list = rCreate();
	LINKLIST *list = INITLIST();
//	LINKLIST *list = hCreate();
//	LINKLIST *get = GET(list,1);
//	LINKLIST *locate = LOCATE(list,'2');
//	int emp = isEmpty(list);
//	DELETE(list,4);
//	INSERT(list,3,'i');
	int len = LENGTH(list);
	listPrint(list);
//	printf("%d",emp);
	printf("length=%d",len);
}

相關文章