最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言數(shù)據(jù)結構與算法之單鏈表

 更新時間:2021年12月23日 14:22:50   作者:玄澈_  
單鏈表是一種鏈式存取的數(shù)據(jù)結構,用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。本文將為大家介紹C語言中單鏈表的基本概念與讀取數(shù)據(jù)元素,需要的可以參考一下

基本概念

鏈表的每一個結點中只包含一個指針域

優(yōu)點 : 儲存空間利用高效

舉例來說:

typedef struct student{
	int id;		//學生編號
	char* name; //學生名稱
 
	//指向下一結點的指針
	struct Student* pNext;
}Student;

與之相反的是多鏈表

typedef struct student{
	int id;		//學生編號
	char* name; //學生名稱
 
	//指向下一結點的指針
	struct Student* pNext;
	struct Student* qNext;
}Student;

讀取數(shù)據(jù)元素

獲取第i個結點的數(shù)據(jù)元素

  1. 聲明一個結點指針p指向鏈表的第一個結點a1,初始化j從1開始
  2. 當j < i 時,遍歷鏈表,讓p的指針向后移動,不斷指向下一個結點,j 累加 1
  3. 當鏈表末尾 p 為空時,則說明第 i 個元素不存在;否則查找成功,返回結點 p 的數(shù)據(jù)

?

1.定義數(shù)據(jù)元素

//定義數(shù)據(jù)元素
typedef struct student{
	int id;		
	char* name; 
}ElementType;

2.定義順序表結構

typedef struct {
	ElementType dates[MAX_SIZE];   //當前順序表中的數(shù)據(jù)集合
	int length;					   //當前順序表中的元素個數(shù)
 
}SeqList;

3.定義鏈表的結點(包括數(shù)據(jù)域和指針域)

typedef struct Node {
	ElementType date;  //數(shù)據(jù)域
	struct Node* node; //指針域,指向下一個結點
}Node;

4.設置頭結點

我們在定義鏈表時,習慣性的會定義頭結點,以便統(tǒng)一鏈表結點的插入和刪除操作

typedef struct Linklist {
	Node* next;  //頭指針
	int length;
}Linklist;

如果鏈表有頭結點,next就指向頭結點,沒有就指向第一個結點

鏈表的長度初始值為0

插入數(shù)據(jù)元素?

在第i個結點后插入數(shù)據(jù)元素 ?

  1. 創(chuàng)建一個空節(jié)點,分配內存空間,設置數(shù)據(jù)元素
  2. 獲取第i個結點,設置新結點的后繼結點為該結點的后繼結點
  3. 設置第i個結點的后繼結點為該結點

1.創(chuàng)建空節(jié)點并為數(shù)據(jù)域賦值

	//創(chuàng)建空節(jié)點并為數(shù)據(jù)賦值
	Node* node = (Node*)malloc(sizeof(Node));
    node -> date = element;
    node -> next = NULL;

2.通過循環(huán)找到要插入的結點

	for (int i = 1; currNode && i < pos - 1; i++)
	{
		currNode = currNode->next;
	}

3.將結點插入并對接前面的結點

	if (currNode) {
		node->next = currNode->next;
		currNode->next = node;
		linkList->length++;
	}

初始化鏈表

void InitLinkList(LinkList* linkList, ElementType* dateArrar, int length)
{
	for (int i = 0; i < length; i++) {
		InsertLinkList(linkList, i + 1, dateArrar[i]);
	}
}

打印鏈表

void PrintLinkList(LinkList* linklist)
{
	Node* node = linklist->next;
	if (!node)
	{
		printf("鏈表為空!\n");
		linklist->length = 0;
		return 0;
	}
	for (int i = 0; i < linklist->length; i++) {
		printf("%d\t%s\t\n", node->date.id, node->date.name);
        node = node->next;
	}
}

順序表查空

int IsLinkListEmpty(LinkList* linkList) {
 
	return linkList->length == 0 ? TRUE : FALSE;
 
}

順序表的刪除?

刪除第i個結點及其數(shù)據(jù)元素

  1. 獲取第i個結點,若該結點不是第一個結點,則獲取第i - 1個結點
  2. 將第i -1個結點的后綴結點設為第i個結點的后綴結點
  3. 刪除第i個結點,釋放內存空間,記錄并返回刪除數(shù)據(jù)元素的值

情況1:當刪除的是第一個元素

	if (pos == 1)
	{
		node = linkList->next;
		if (node) {
			element = node->date;
			linkList->next = node->next;
			free(node);  //釋放被刪除的結點
			linkList->length--;
		}
        return element;
	}

情況2:除第一個結點外

  1. 找到要刪除的結點和他的前綴結點
  2. 要刪除結點的next 賦值給前綴結點
  3. 釋放要刪除的結點
	Node* preNode; //前綴結點
	node = linkList->next;
	for (int i = 1; node && i < pos; i++)
	{
		preNode = node;
		node = node->next;
	}
	if (node)
	{
		element = node->date;
		preNode->next = node->next;
		free(node);
		linkList->length--;
	}
	return element;

完整代碼

ElementType DeleteLinkListElement(LinkList* linkList, int pos)
{
	ElementType element;   //被刪除的元素
	element.id = -999;     //賦一個不可能的值,來判斷刪除是否成功
	Node* node = NULL;
 
	if (pos == 1)
	{
		node = linkList->next;
		if (node) {
			element = node->date;
			linkList->next = node->next;
			free(node);  //釋放被刪除的結點
			linkList->length--;
		}
	}
 
	Node* preNode; //前綴結點
	node = linkList->next;
	for (int i = 1; node && i < pos; i++)
	{
		preNode = node;
		node = node->next;
	}
	if (node)
	{
		element = node->date;
		preNode->next = node->next;
		free(node);
		linkList->length--;
	}
	return element;
 
}

刪除單鏈表整表

  1. 聲明結點p 和 q
  2. 將第一個結點賦值給p
  3. 循環(huán)將下一個結點賦值給q,釋放p,將q賦值給p

?

void CleatLinkList(LinkList* linkList)
{
	Node* node = linkList->next;
	Node* nextNode;
	while (node) {
		nextNode = node->next;  //先記錄當前結點的下一個結點,以便釋放當前結點的內存
		free(node);
		node = nextNode;
	}
	linkList->next = NULL;
	linkList->length = 0;
}

單鏈表VS順序表

?

?

以上就是C語言數(shù)據(jù)結構與算法之單鏈表的詳細內容,更多關于C語言單鏈表的資料請關注腳本之家其它相關文章!

相關文章

  • C語言 structural body結構體詳解用法

    C語言 structural body結構體詳解用法

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結構是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲不同類型的數(shù)據(jù)項,結構用于表示一條記錄,假設您想要跟蹤圖書館中書本的動態(tài),您可能需要跟蹤每本書的下列屬性
    2021-10-10
  • C++多線程編程詳解

    C++多線程編程詳解

    這篇文章主要介紹了c語言多線程編程使用示例,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09
  • C語言實現(xiàn)電話簿項目管理

    C語言實現(xiàn)電話簿項目管理

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電話簿項目管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++多線程之互斥鎖與死鎖

    C++多線程之互斥鎖與死鎖

    互斥鎖和死鎖是C++多線程中常見的情況,這篇文章就帶大家進一步了解多線程中的互斥鎖與死鎖這兩個概念,文中的示例代碼介紹得很詳細,快來跟隨小編一起學習吧
    2021-12-12
  • C++遍歷文件夾獲取文件列表

    C++遍歷文件夾獲取文件列表

    這篇文章主要為大家詳細介紹了C++遍歷文件夾獲取文件列表的相關資料,感興趣的小伙伴們可以參考一下
    2016-05-05
  • C++程序中添加.c.h的實現(xiàn)方法

    C++程序中添加.c.h的實現(xiàn)方法

    這篇文章主要介紹了C++程序中添加.c.h的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言數(shù)據(jù)結構中數(shù)制轉換實例代碼

    C語言數(shù)據(jù)結構中數(shù)制轉換實例代碼

    這篇文章主要介紹了C語言數(shù)據(jù)結構中數(shù)制轉換實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • C++11運算符重載和向量類重載實例詳解(<<,>>,+,-,*等)

    C++11運算符重載和向量類重載實例詳解(<<,>>,+,-,*等)

    這篇文章主要給大家介紹了關于C++11運算符重載和向量類重載的相關資料,主要包括<<,>>,+,-,*等,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • C語言詳細分析宏定義與預處理命令的應用

    C語言詳細分析宏定義與預處理命令的應用

    宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的替換。字符串中可以含任何字符,可以是常數(shù),也可以是表達式,預處理程序對它不作任何檢查,如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)
    2022-07-07
  • Qt實現(xiàn)進程間通信

    Qt實現(xiàn)進程間通信

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)進程間通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

宜川县| 荣昌县| 宣汉县| 抚州市| 黄骅市| 万源市| 遵化市| 涞源县| 丹阳市| 绍兴市| 嵊泗县| 句容市| 涞源县| 通海县| 恩施市| 达拉特旗| 太湖县| 连云港市| 普宁市| 宜黄县| 九龙城区| 沙湾县| 武功县| 九江市| 辛集市| 丰宁| 东兰县| 龙岩市| 孟连| 大英县| 阿拉尔市| 社旗县| 手游| 隆昌县| 尖扎县| 古田县| 饶平县| 扎囊县| 上饶市| 慈利县| 思南县|