1. 程式人生 > 其它 >資料結構與演算法_連結串列

資料結構與演算法_連結串列

技術標籤:資料結構與演算法資料結構連結串列

連結串列基本操作函式

**連結串列框架**
typedef struct LNode//結構體宣告不能為匿名
{
	int num;           //資料
	struct LNode* next;//地址  
}LNode,*LinkList;

連結串列的基本結構,num中存放該結點的資料,next存放下個結點地址的指標。

**連結串列初始化**
/*初始化*/
LinkList CreatLinkList(int *data,int len)
{
	LinkList head,pre;//head為頭結點,pre是儲存當前結點的前驅
	LinkList node;
//node為新開闢的結點 node=(LinkList)malloc(sizeof(LinkList)); head = node; head->next = NULL;//頭結點不存值,只存地址 pre = head; for (int i = 0; i < len; i++) { node = (LinkList)malloc(sizeof(LinkList)); node->num = data[i]; node->next = NULL; pre->next = node;//第一次迴圈時將結點地址存入頭結點的next中 pre = node;
//這兩句將當前結點的地址存入上個地址的next中 } return head; }

定義的函式為LinkList型別,用於返回同樣型別的頭結點指標,連結串列通過頭結點來呼叫。
連結串列的生成過程為用malloc函式開闢地址,開闢新的結點node,給結點node中的num賦值,並且用pre指標存放上個結點node,然後將它的next指向當前結點node,從而實現next中地址的依次儲存以及num的賦值。此過程結束後,連結串列生成,返回頭結點用來呼叫。

**結點的定義方法**
	Linklist p;
	p = (LinkList)malloc(sizeof(LinkList));
	//分配記憶體(結點先定義再分配記憶體)
//單純的指標如頭結點是不用分配數值的, //故不用malloc函式分配記憶體
**插入函式LinkListInsert(LinkList L,int i,LinkList L1);**
	void LinkListInsert(LinkList L, int i, LinkList L1)
	{
	int k=0;
	while (k < i-1)//迴圈結束條件:k=i-1時迴圈結束,指標L
	{			   //指向第i-1個結點
		L = L->next;//連結串列指標向後遍歷
		k++;
	}
	L1->next = L->next;//結點L1指向第i個結點
	L->next = L1;//第i-1個結點指向結點L1
}

在原連結串列第i個位置插入新結點L1,需要將第i-1個結點找出來,將它的next賦給L1的next,再將它的next指向L1即可,如圖:
在這裡插入圖片描述
L1插入前
在這裡插入圖片描述
L1插入後

**刪除函式LinkListDelete(LinkList L,int i);**
	void LinkListDelete(LinkList L,int i)
	{
	int k = 0;		//將第i-1個結點指向第i+1個結點,然後釋放掉第i個結點
	while (k < i-1)//迴圈結束條件:k=i-1時迴圈結束
	{
		L = L->next;
		k++;
	}
	L->next = L->next->next;
	}

在這裡插入圖片描述刪除前
在這裡插入圖片描述刪除後

**連結串列的搜尋int LinkListSearch(LinkList L,int i);**
	int LinkListSearch(LinkList L,int i)//返回第i個結點所存數值
	{
	int k = 0;
	while (k < i)//迴圈結束條件:k=i時迴圈結束
	{
		L = L->next;
		k++;
	}
	return L->num;
}