簡單連結串列——尾插法

liu_endong發表於2020-12-29

眼看這2020年就要過去了,部落格才寫了30篇,複習下資料結構順便水一下部落格。

我比較喜歡先自己想,想完再寫寫,不會了再參考網上的資料。

寫這個連結串列時候,刪除節點老是不對,照著寫了幾遍就對了,算是背下來的吧,好像還真是沒有完全理解。

反正以後用的時候還是要去仔細研究,現在就寫個能用的,下面該看佇列了,要不然卡在這裡就像英語記單詞abandon一樣。溜了溜了,水篇部落格,希望不是製造了個網路垃圾。。。

#include <stdio.h>
#include<malloc.h>

#define LEN sizeof(struct List)

#if 1   //1開啟 0關閉  VS2019開啟 codeblocks關閉
#define scanf scanf_s
#endif


//定義節點
struct List  
{
	int num;
	struct List* next;
};

//建立一個連結串列,長度為30,從0到29賦值,初始化連結串列
struct List* creat() 
{
	struct List* head, * p1, * p2;
	p1 = p2 = (struct List*)malloc(LEN);
	head = p1;
	for (int a = 0; a < 30; a++)
	{
		p1->num = a;
		p2->next = p1;
		p2 = p1;
		p1 = (struct List*)malloc(LEN);
	}
	p2->next = NULL;
	return head;
}

//尾插法加一個節點
struct List* addList(List* head,int num)  
{
	struct List* p;
	p = head;
	while(p->next!=NULL)
	{
		p = p->next;
	}
	p->next = (struct List*)malloc(LEN);
	p->next->num = num;
	p->next->next = NULL;
	return head;
}

//按儲存的資料刪除一個節點
struct List* deleteList(List* head, int num)
{
	struct List* p1,*p2;
	p1 = p2 = head;
	while (p1->next)
	{
		p2 = p1;
		p1 = p1->next;
		if (p1->num==num)
		{
			p2->next = p1->next;
			break;
		}
	}
	return head;
}

//遍歷連結串列
void print(struct List* head)
{
	struct List* p;
	p = head;
	while (p != NULL)
	{
		printf("%d\n", p->num);
		p = p->next;
	}
}

int main()
{
	struct List* p;  //初始化一個連結串列
	p = creat();  //呼叫建立函式來建立一個連結串列
	print(p);
	printf("\n");
	p = addList(p, 10);  //從尾巴新增一個10
	print(p);
	printf("\n");
	p = deleteList(p, 5);   //刪除元素為5的節點
	print(p);
}

 

相關文章