線性表中的單向連結串列的簡單操作

CodingBoy發表於2019-06-09

單向連結串列是連結串列中的一種,其特點是連結串列的連結方向是單向的,對連結串列的訪問要通過從頭部開始,依序往下讀取。當然,往後對資料結構的深入學習,還會涉及到雙向連結串列、迴圈連結串列等線性表,我在這裡就不再解釋了。

連結串列主要是由結點一個個相繼串起來的,其中每一個結點又被分為兩個部分:(data)資料域、(next)指標域。

  • 資料域(data):主要是儲存的是關於結點的資訊
  • 指標域(next):儲存的是下一個結點的地址

線性表中的單向連結串列的簡單操作

單向連結串列的形式:

線性表中的單向連結串列的簡單操作

那麼,既然我們知道了單連結串列的元素是什麼樣了,以及單連結串列的形式是如何了,我們就可以開始動手實現簡單的增、刪、查、改。

首先,要學會連結串列的建立,建立無非也就是增加:

  • 如果連結串列為空,那麼建立連結串列並且將增加的這個結點作為第一個結點

線性表中的單向連結串列的簡單操作

  • 如果連結串列不為空,那麼就直接遍歷插到尾部

線性表中的單向連結串列的簡單操作

需要說明的是,為了避免二重指標的操作,便於各位的理解,我這裡用的是頭結點來儲存指向第一個結點的地址,也就是我捨去了頭結點的資料域,以它的next指向一個新的結點,如上圖的單向連結串列的形式

//兩個引數  一個是頭結點,一個是 要插入的結點
//頭結點:它的next指向的才是一個新的結點開始
void addNode(listNode * head, listNode * q)
{
	listNode * p = head->next; 
	if (head->next == NULL)
	{
		head->next = q;
	}
	else
	{
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = q;
	}
}
複製程式碼

連結串列的刪除:這裡的刪除,指的是刪除其中的某個結點,既然要刪除某個結點,那麼便是要遍歷出符合給定條件的就把它刪除。

void deleteNode(listNode * head, int data) 
{
	listNode * p = head->next, *q = head;
	//如果是空的  可以返回一個提醒也可以不處理
	while (p)
	{
		if (p->data == data)
		{
			q->next = p->next;
			free(p);
			break;
		}
		q = p;
		p = p->next;
	}
}
複製程式碼

線性表中的單向連結串列的簡單操作

查、改的操作在這裡我就不細說了,因為,這個實現起來就是一個迴圈,然後再判斷每一個資料域是否與你要查詢的一致...

最後,我以一個整體的程式結束這篇部落格:

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

 struct listNode
{
	int data;
	struct listNode * next; 
};
 typedef struct listNode listNode;
void addNode(listNode * head, listNode * q);
void deleteNode(listNode * head, int data);
int main()
{
	listNode head,*q,*p;
	head.next = NULL;
	int i;

	//連結串列的建立
	for (i = 1; i < 6; i++) 
	{
		q = (listNode *)malloc(sizeof(listNode));
		if (!q)  exit(0);
		q->data = i;
		q->next = NULL;
		addNode(&head, q);
	}

	p = head.next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");

	deleteNode(&head, 2);  //刪除資料域為 2 的結點

	p = head.next;
	//遍歷輸出
	while (p) 
	{
		printf("%d ", p->data);
		p = p->next;
	}

	//釋放整個連結串列的記憶體空間
	p = head.next;
	q = &head;
	while (p)
	{
		q->next = p->next;
		free(p);
		p = q->next;
	}


	return  0;
}

//兩個引數  一個是頭結點,一個是 要插入的結點
//頭結點:它的next指向的才是一個新的結點開始
void addNode(listNode * head, listNode * q)
{
	listNode * p = head->next; 
	if (head->next == NULL)
	{
		head->next = q;
	}
	else
	{
		while (p->next != NULL)
		{
			p = p->next;
		}
		p->next = q;
	}
}

void deleteNode(listNode * head, int data) 
{
	listNode * p = head->next, *q = head;
	//如果是空的  可以返回一個提醒也可以不處理
	while (p)
	{
		if (p->data == data)
		{
			q->next = p->next;
			free(p);
			break;
		}
		q = p;
		p = p->next;
	}
}

複製程式碼

執行結果:

線性表中的單向連結串列的簡單操作

如果您喜歡的話,記得點個贊哇!!!Thanks.

相關文章