線性表中的單向鏈表的簡單操做

單向鏈表是鏈表中的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過從頭部開始,依序往下讀取。固然,日後對數據結構的深刻學習,還會涉及到雙向鏈表、循環鏈表等線性表,我在這裏就再也不解釋了。數據結構

鏈表主要是由結點一個個相繼串起來的,其中每個結點又被分爲兩個部分:(data)數據域、(next)指針域。學習

  • 數據域(data):主要是保存的是關於結點的信息
  • 指針域(next):存儲的是下一個結點的地址

單向鏈表的形式:ui

那麼,既然咱們知道了單鏈表的元素是什麼樣了,以及單鏈表的形式是如何了,咱們就能夠開始動手實現簡單的增、刪、查、改。spa

首先,要學會鏈表的建立,建立無非也就是增長:3d

  • 若是鏈表爲空,那麼創建鏈表而且將增長的這個結點做爲第一個結點

  • 若是鏈表不爲空,那麼就直接遍歷插到尾部

須要說明的是,爲了不二重指針的操做,便於各位的理解,我這裏用的是頭結點來保存指向第一個結點的地址,也就是我捨去了頭結點的數據域,以它的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;
	}
}
複製代碼

鏈表的刪除:這裏的刪除,指的是刪除其中的某個結點,既然要刪除某個結點,那麼即是要遍歷出符合給定條件的就把它刪除。code

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;
	}
}
複製代碼

查、改的操做在這裏我就不細說了,由於,這個實現起來就是一個循環,而後再判斷每個數據域是否與你要查找的一致...cdn

最後,我以一個總體的程序結束這篇博客:blog

#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.

相關文章
相關標籤/搜索