單連結串列實現增刪改查

MR嵌入式猿程式發表於2020-11-16
#include "myhead.h"
//定義結構體表示單連結串列
struct siglelist
{
	int data;
	struct siglelist *next;
};

//封裝連結串列的初始化
struct siglelist *list_init()
{
	struct siglelist *myhead=malloc(sizeof(struct siglelist));
	myhead->next=NULL;
	return myhead;
}

//尾部插入
int insert_tail(int newdata,struct siglelist *head)
{
	//找到連結串列的尾部
	struct siglelist *p=head;
	while(p->next!=NULL)
		p=p->next; //把賦值=  翻譯成指向
	//準備好新的節點
	struct siglelist *newnode=malloc(sizeof(struct siglelist));
	newnode->data=newdata;
	newnode->next=NULL;
	
	//p的下一個節點指向newnode
	p->next=newnode;
}

//中間插入,把newdata插入到olddata的後面
int insert_mid(int newdata,int olddata,struct siglelist *head)
{
	//找到olddata所在的節點
	struct siglelist *p=head;
	while(p->next!=NULL)
	{
		p=p->next;
		if(p->data==olddata)
			break;
	}
	//準備新節點
	struct siglelist *newnode=malloc(sizeof(struct siglelist));
	newnode->data=newdata;
	newnode->next=NULL;
	
	newnode->next=p->next;
	p->next=newnode;
}

//單連結串列的刪除,用兩個指標解決
int remove_list(int deldata,struct siglelist *head)
{
	int flag=0; //標記是否找到要刪除的資料
	//找到要刪除的節點
	struct siglelist *q=head;
	struct siglelist *p=head->next;
	while(p->next!=NULL)
	{
		if(p->data==deldata)
		{
			flag=1;
			q->next=p->next;
			p->next=NULL;
			free(p);
			p=q->next;
		}	
		else
		{
			p=p->next;
			q=q->next;
		}
	}
	//經過仔細分析,發現前面的迴圈漏掉了最後一個資料沒有判斷,沒有刪除
	if(p->next==NULL && p->data==deldata)
	{
		//把最後一個資料刪除即可
		q->next=NULL;
		free(p);
		p=NULL;
		return 0;
	}
	if(flag==0 && p->next==NULL && p->data!=deldata)
	{
		printf("沒有你要刪除的資料!\n");
		return -1;
	}
}
//列印連結串列
int show_list(struct siglelist *head)
{
	struct siglelist *p=head;
	while(p->next!=NULL)
	{
		p=p->next;
		printf("當前遍歷的節點中存放的資料是:%d\n",p->data);
	}
}
int main()
{
	int m,n;
	int i;
	//準備頭節點
	struct siglelist *mylist=list_init();
	//尾插一部分資料
	for(i=0; i<4; i++)
	{
		printf("輸入尾插資料!\n");
		scanf("%d",&m);
		insert_tail(m,mylist);
	}
	
	//列印 
	printf("=====尾部插入========\n");
	show_list(mylist);
	
	//刪除資料
	printf("請輸入你要刪除的資料!\n");
	scanf("%d",&n);
	remove_list(n,mylist);
	printf("=====刪除完畢========\n");
	show_list(mylist);
	
	
}

相關文章