單鏈表
- 大體思路
- 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一起討論
