1. 程式人生 > >C語言連結串列的建立插入等綜合實戰

C語言連結串列的建立插入等綜合實戰

系本人原創,轉載請註明出處:

程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶,

先放上鍊表的結構體:

typedef struct student
{
	int num;
	char name[10];
	char sex;
	struct student* next;
 }Stu;

關於老生常談的連結串列建立,直接放原始碼了啦啦啦:

	Stu* p1,*p2;//p2屬於中間臨時變數 
	n=0;
	if((p1=p2=(Stu*)malloc(LEN))==NULL)
	{
		printf("Malloc Error!");
	}
	printf("\n\t\tPlease input the number, name and sex for students (it will be end when inputing 0) :\n");
	scanf("%d%s%*c%c",&p1->num,p1->name,&p1->sex);
	while(p1->num!=0)
	{
		n++;
		if(n==1)
			head=p1;
		else
			p2->next=p1;
		p2=p1;
		if((p1=(Stu *)malloc(LEN))==NULL)
		{
			printf("Malloc Error!");
		}
		scanf("%d%s%*c%c",&p1->num,p1->name,&p1->sex);
	}
	p2->next=NULL;
	return head;

此處要注意的是p2只是一個臨時的結構體指標,暫時儲存p1的值,然後p1再去開闢空間。

還需要注意的一點是scanf中字串和字元在一起時的處理,%s和%c之間要加一個%*c去吸收一個空格

列印連結串列就不說了,一直指向下一個next,直到空指標為之就OK了。

對於檢視某個節點或者刪除某個節點的時候,需要加一個node變數,用來計算連結串列的節點數,下面就放上刪除某個節點的程式碼了:

Stu* del(Stu*head)
{
	Stu* p1,*p2;
	p2=p1=head;
	int num,k=0,node=1;
	if(head==NULL)
	{
		printf("\n\t\t\tPlease creat a single linked list pressing No.1");
		getchar();
		getchar();
		return head;
	}
	printf("\n\t\t\tPlease input the node you wanna delete:");
	scanf("%d",&num);
	for(;node!=num;node++,p1=p1->next)
		if(p1->next==NULL)
		{
			node=1;
			p1=head;
			printf("\n\t\t\tYour number is wrong, please input again:");
			scanf("%d",&num);
			if(node==num) break;
		}
	node=1;
	p1=head;
	while(p1!=NULL)
	{
		
		if(node==num&&k==0)
		{
			head=p1->next;
			break;
		}
		if(node==num&&k!=0)
			p2->next=p1->next;
		p2=p1;//p2指向p1的上一個節點 
		p1=p1->next;
		k++;
		node++;
	}
	system("cls"); 
	printf("\n\t\t\tOK!");
	getchar();
	getchar();
	return head;
}

這裡有一個節點數輸錯的報錯並返回機制:我可是想了好久才想到的,,,囧

方法就是先用一個for迴圈(當輸入的節點數和node不相等時繼續迴圈),當連結串列遍歷完畢後,如果還不相等就提示出錯並返回重新輸入。此處p2的作用和建立連結串列時的作用一樣。

接著就是插入某一節點的連結串列哈~(輸入0表示插入到連結串列的第一位),原始碼奉上:

Stu* insert(Stu * head)
{
	Stu* p1,*p2;
	p1=head;
	int num,node=0;
	if(head==NULL)
	{
		printf("\n\t\t\tPlease creat a single linked list pressing No.1");
		getchar();
		getchar();
		return head;
	}
	if((p2=(Stu*)malloc(LEN))==NULL)
	{
		printf("Malloc Error!");
	}
	printf("\n\t\t\tPlease input the node you wanna insert(the first inputing 0):");
	scanf("%d",&num);
	for(;node!=num;node++,p1=p1->next)//出錯機制 
		if(p1==NULL)
		{
			p1=head;
			node=0;
			printf("\n\t\t\tYour node is wrong, please input again:");
			scanf("%d",&num);
			if(node==num) break;
		}
	p1=head;
	node=1;
	printf("\n\t\t\tPlease input the number, name and sex you wanna insert:");
	scanf("%d%s%*c%c",&p2->num,p2->name,&p2->sex);
	while(p1!=NULL) 
	{
		if(num==0)
		{
			p2->next=head;
			head=p2;
			break;
		}
		if(node==num&&num!=0)
		{
			p2->next=p1->next;
			p1->next=p2;
			break;
		}
		p1=p1->next;
		node++;
	}
	system("cls"); 
	printf("\n\t\t\tOK!");
	getchar();
	getchar();
	return head;
}

此處p2 的作用是插入的那個節點。

剛開始學習連結串列的時候覺得插入最難,其實逆序比插入難好多(╯▽╰):

剛開始我只定義了一個指標就想逆序成功,結果成功被打臉,然後最後寫了虛擬碼才知道,需要三個結構體指標才行╭(╯^╰)╮

具體的辦法如下滴:

先令p2=p1->next;

然後p1->next=NULL;

p3=p2->next;

p2->next=p1;

然後再令p1=p3->next;開始迴圈

值得注意的時,每指向下一個時都需要檢驗是否為空哦。

放上程式碼:

Stu* reverse(Stu*head)
{
	Stu *p1, *p2, *p3;
	p1=head;
	if(head==NULL)
	{
		printf("\n\t\t\tPlease creat a single linked list pressing No.1");
		getchar();
		getchar();
		return head;
	}
	p2=p1->next;
	p1->next=NULL;
	if(p2==NULL)
	{
		printf("\n\t\t\tOK!");
		getchar();
		getchar();
		return p1;
	}	
	while(1)
	{
		p3=p2->next;//
		p2->next=p1;
		if(p3==NULL)
		{
			head=p2;break;
		}
		p1=p3->next;//
		p3->next=p2;
		if(p1==NULL)
		{
			head=p3;break;
		}
		p2=p1->next;//
		p1->next=p3;
		if(p2==NULL)
		{
			head=p1;break;
		}
	}
	system("cls"); 
	printf("\n\t\t\tOK!");
	getchar();
	getchar();	
	return head;
}

這就完成逆序了啦啦啦

ojbk!!!!

安排!!!