數據結構與算法 第一講 單鏈表


單鏈表

  • 大體思路
  • 1.創建結構體---------具體事物的抽象(這里指鏈表的每一個節點)
  • 2.創建鏈表
  • 3.創建節點
  • 4.插入操作
    • 4.1 表頭插入
    • 4.2 表尾插入
    • 4.3 指定位置插入(指定位置的前面)
  • 5.刪除操作
    • 5.1表頭刪除
    • 5.2 表尾刪除
    • 5.3指定位置刪除
  • 6.判斷是否為空
  • 7.打印鏈表
//本程序所需要的頭文件
#include<stdio.h>
#include<stdlib.h>  //包含了exit函數
#include<malloc.h> 
//1.創建結構體
//如果把數據域寫成結構體的話,就可以存儲許多的數據了。
typedef struct singlelist {
	int data;                   //數據域
	struct  singlelist *next;   //指針域


}LIST, *LPLIST;


一定要把這個結構體的含義理解清楚

                                         //2.創建鏈表--------我們可以理解成創建了第一個節點,索引的節點(頭節點)
  LPLIST  CreateList() {
                                        //創建過程就是初始化過程------初始化基本數據成員
                                       //需要分配內存空間
	LPLIST List = (LPLIST)malloc(sizeof(LIST));
	if (List ==NULL) {
		printf("分配內存空間失敗,創建鏈表不成功。\n");
		system("pause");
		exit(0);

	}
	//初始化數據成員  有表頭的鏈表.
	List->next = NULL;
	return List;

}

//3.創建節點
LPLIST  CreateNode(int data) {

	//首先分配內存
	//只是比創建鏈表多了數據域
	LPLIST Node = (LPLIST)malloc(sizeof(LIST));
	if (Node == NULL) {
		printf("分配內存空間失敗,創建節點不成功\n");
		system("pause");
		exit(0);

	}
	Node->data = data;
	Node->next = NULL;

	return  Node;
}
                 //4.插入操作
                 //4.1頭插法:在頭節點的后面插入
                //函數寫法:形參可以表示要操作的東西
                //插入的鏈表是(List),插入的數據是多少(data)
void InsertHeadNode(LPLIST List,int data) {

	//在實行鏈表的插入是一定要先連接后斷開;
	//插入:創建插入的節點
	LPLIST NewNode = CreateNode(data);
	//插入操作
	NewNode->next = List->next;
	List->next = NewNode;
}

  //4.2  尾插法
void InsertTailNode(LPLIST List, int data) {
   //找到表尾----》定義一個移動的指針tailNode來找到尾節點
	LPLIST tailNode = List;
	while (tailNode->next != NULL) {
		tailNode = tailNode->next;

	}

	//插入:創建插入的節點;
	LPLIST NewNode = CreateNode(data);
	//插入操作
	tailNode->next = NewNode;

}


//4.3 指定位置插入(這里面是在指定位置的前面插入)
int  IsEmptyList(LPLIST List);     //這里是為了在指定位置插入函數里面調用鏈表是否為空的函數說明。
void InsertMiddleNode(LPLIST List, int data,int middle){
	//創建兩個移動的指針,去找指定位置和指定位置的前面
	LPLIST frontNode= List;
	LPLIST tailNode = List->next;
	//判斷是否為空
	if (IsEmptyList(List)) {
		printf("鏈表為空無法從指定位置插入\n");
		system("pause");
		exit(0);
	}
	while (tailNode->data != middle) {
		//frontNode = frontNode->next;
		//tailNode = tailNode->next;  //這里有兩種寫法,看個人喜好。
		frontNode = tailNode;
		tailNode = frontNode->next;

		if (tailNode == NULL) {

			printf("沒有緣分,無法找到");
			system("pause");
			exit(0);
		}
	}
	//創建要插入的新節點
	LPLIST NewNode=CreateNode(data);
	/*NewNode->next = tailNode;
	frontNode->next = NewNode;
	*/
	
	frontNode->next = NewNode;
	NewNode->next = tailNode;

}
//5.----------判斷鏈表是否為空
//和創建的時候比較
int  IsEmptyList(LPLIST List) {
	if (List->next == NULL) 

		return 1;
	return 0;
}

//6.------>遍歷鏈表
void   PrintfList(LPLIST  List) {
	if (IsEmptyList(List)) {

		printf("鏈表為空無法打印\n");
			system("pause");
			exit(0);

	}
//定義一個移動指針p來遍歷鏈表
	LPLIST p = List->next;
	while (p != NULL)
	{

		printf("%d\t",p->data);
		p = p->next;
	}
	printf("\n");
}

 //7.刪除操作
 // 7.1  頭刪發
void DeleteListHeade(LPLIST List) {
	if (IsEmptyList(List)) {

		printf("鏈表為空無法刪除\n");
		system("pause");
		exit(0);

	}
    //把首節點(就是頭節點的下一個節點)的地址賦值給一個臨時指針tmp
	LPLIST tmp = List->next;
	List->next = tmp->next;
	free(tmp);
	tmp=NULL;          //防止野指針的情況出現。

}

//7.2尾刪除法
void DeleListTail(LPLIST List) {
	if (IsEmptyList(List)) {

		printf("鏈表為空無法刪除\n");
		system("pause");
		exit(0);

	}
	LPLIST tailNode = List->next;
	LPLIST frontNode = List;
	//找到尾節點
	while (tailNode->next!=NULL) {
		frontNode = tailNode;                       
													
		tailNode = frontNode->next;

	}
	frontNode->next = NULL;
	free(tailNode);
	tailNode = NULL;

}

//.3指定位置刪除
void deletemiddle(LPLIST list, int data) {
	//創建兩個移動的指針;去找指定為位置和指定位置的前面
	LPLIST frontNode = list;
	//frontNode->next==tailNode;判斷相鄰
	LPLIST tailNode = list->next;
	//判斷是否為空
	while (tailNode->data != data) {
		/*
		frontNode=frontNode->next;
		tailNode=tailNode->next;
		*/
		frontNode = tailNode;
		tailNode = frontNode->next;
		if (tailNode == NULL) {
			printf("未找到指定位置\n");
			system("pause");
			exit(0);
		}

	}
	frontNode->next = tailNode->next;
	free(tailNode);

}



下面我們來用main()函數測試以下

int main() {

	LPLIST List = CreateList();   //創建成功;
	InsertHeadNode(List, 1);      //頭插法
	InsertHeadNode(List, 2);      //頭插法
	InsertHeadNode(List, 3);      //頭插法
	PrintfList(List);
	InsertHeadNode(List, 4);      //頭插法
	PrintfList(List);
	InsertTailNode(List, 0);      //尾插法
	PrintfList(List);
	InsertMiddleNode(List, 6, 3); //在指定位置插入
	
	PrintfList(List);
	DeleteListHeade(List);         //頭刪法
	PrintfList(List);
	DeleListTail( List);           //尾刪除法
	PrintfList(List);
	deletemiddle(List, 3);         //指定位置刪除
	PrintfList(List);
	system("pause");
	return 0;
}

測試結果如下圖

歡迎加我qq485536603一起討論


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM