1. 程式人生 > >單鏈表的基本操作(C語言)//以整型為例

單鏈表的基本操作(C語言)//以整型為例

        單鏈表與陣列相似,但是單鏈表堆記憶體的運用更加的方便,能夠充分的利用零散的記憶體,在中間新增或者刪除一個或多個元素時不需要像陣列一樣移動大量的元素。單鏈表的操作中,涉及到單鏈表元素變化的許耀中指向指標的指標操作。

        下面是單鏈表的兩種建立方式以及其他的一些操作(兩種建立方式分別使用):

#include<stdio.h>
#include<stdlib.h>


typedef struct Node
{
	int date;
	struct Node *next;
}Node;
typedef struct Node *Link;
Link l;

void setl(Link *L, int n)//頭插法 
{
	Link p;
	int i;
	printf("請輸入元素:");
	*L = (Link)malloc(sizeof(Node));//為頭結點申請記憶體 
	(*L)->next = NULL;//建立空連結串列 
	for(i = 0; i < n; i++)
	{
		p = (Link)malloc(sizeof(Node));//為每個元素申請記憶體 
		scanf("%d",&p->date);
		p->next = (*L)->next;
		(*L)->next = p;//最後一個結點只想NULL 
	}
}
void setl(Link *L, int n)//尾插法 
{
	Link p, r;
	int i;
	printf("請輸入元素:");
	*L = (Link)malloc(sizeof(Node));//為頭結點申請記憶體 
	r = (*L);
	for(i = 0; i < n; i++)
	{
		p = (Link)malloc(sizeof(Node));//為每個元素申請記憶體 
		scanf("%d",&p->date);
		r->next = p;
		r = p;
	}
	r->next = NULL;//最後一個結點只想NULL 
} 
void readl(Link L) //讀取連結串列 
{
	printf("你輸入的元素為:");
	Link p;
	p = L->next;
	while(p)
	{
		printf("%d ",p->date);
		p = p->next;
	}
	printf("\n");
}
void deletel(Link *L, int i)//刪除第i個元素 
{
	Link p, r;
	int j = 1;
	p = (*L);
	while(p->next && j < i)//判斷是否為第i個元素 
	{
		p = p->next;
		j++;
	}
	r = p->next;
	p->next = r->next;
	free(r);
}
void Ldele(Link *L, int m)//刪除為m的元素 
{
	Link p, r;
	p = (*L);
	int flag = 1;
	while(p->next){ 
		if(p->next->date == m){
			flag = 0;
			break;
		}
		p = p->next;
	}
	if(flag == 1)
		printf("沒有這個元素!\n");
	else{
		r = p->next;
		p->next = r->next;
		free(r);
	}
}
int main()
{
	int n;
	printf("請輸入元素個數:");
	scanf("%d",&n);
	setl(&l,n);
	readl(l);
	int i;
	printf("請輸入要刪除的位置(小於%d):",n);
	scanf("%d",&i);
	deletel(&l,i);
	readl(l);
	int m;
	printf("請輸入要刪除的元素:");
	scanf("%d",&m);
	Ldele(&l,m);
	read(l);
	return 0;
}