c語言——靜態鏈表
鏈表結點類型定義
如何遍歷鏈表
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//鏈表結點類型定義
struct LinkNode
{
int data;
struct LinkNode *next;
};
void test()
{
struct LinkNode node1 = { 10, NULL };
struct LinkNode node2 = { 20, NULL };
struct LinkNode node3 = { 30, NULL };
struct LinkNode node4 = { 40, NULL };
struct LinkNode node5 = { 50, NULL };
struct LinkNode node6 = { 60, NULL };
node1.next = &node2;
node2.next = &node3;
node3.next = &node4;
node4.next = &node5;
node5.next = &node6;
//如何遍歷鏈表?
//先定義一個輔助指針變量
struct LinkNode *pCurrent = &node1;
while (pCurrent != NULL)
{
printf("%d ",pCurrent->data);
//指針移動到下一個元素的首地址
pCurrent = pCurrent->next;
}
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}
運行
10 20 30 40 50 60
c語言——動態鏈表
頭文件 LinkList.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdlib.h>
#include<stdbool.h>
#include<stdio.h>
#ifdef __cplusplus
extern "C"{
#endif
//定義節點數據類型
struct LinkNode
{
int data;
struct LinkNode *next;
};
//初始化鏈表
struct LinkNode *Init_LinkList();
//在值爲oldval的位置插入新的數據newval
void InsertByValue_LinkList(struct LinkNode *header,int oldval,int newval);
//刪除值爲val的結點
void RemoveByValue_LinkList(struct LinkNode *header,int delValue);
//遍歷
void Foreach_LinkList(struct LinkNode *header);
//銷燬
void Destroy_LinkList(struct LinkNode *header);
//清空
void Clear_LinkList(struct LinkNode *header);
#ifdef __cplusplus
}
#endif
主文件 LinkList.c
#include"LinkList.h"
//初始化鏈表
struct LinkNode *Init_LinkList()
{
//創建頭結點
struct LinkNode *header = malloc(sizeof(struct LinkNode));
header->data = - 1;
header->next = NULL;
//尾部指針
struct LinkNode *pRear = header;
int val = -1;
while (true)
{
printf("輸入插入的數據:\n");
scanf("%d",&val);
if (val == -1)
{
break;
}
//先創建新節點
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = val;
newnode->next = NULL;
//新節點插入到鏈表中
pRear->next = newnode;
//更新尾部指針指向
pRear = newnode;
}
return header;
}
void InsertByValue_LinkList(struct LinkNode *header, int oldval, int newval)
{
if (NULL == header)
{
return;
}
//兩個輔助指針變量
struct LinkNode *pPrev = header;
struct LinkNode *pCurrent = pPrev->next;
while (pCurrent != NULL)
{
if (pCurrent->data == oldval)
{
break;
}
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
#if 0
//如果pCurrent爲NULL 說明鏈表中不存在值爲oldval的結點
if (pCurrent == NULL)
{
return;
}
#endif
//先創建新結點
struct LinkNode *newnode = malloc(sizeof(struct LinkNode));
newnode->data = newval;
newnode->next = NULL;
//新節點插入到鏈表中
newnode->next = pCurrent;
pPrev->next = newnode;
}
//刪除值爲val的結點
void RemoveByValue_LinkList(struct LinkNode *header, int delValue)
{
if (NULL == header)
{
return;
}
//兩個輔助指針變量
struct LinkNode *pPrev = header;
struct LinkNode *pCurrent = pPrev->next;
while (pCurrent != NULL)
{
if (pCurrent->data == delValue)
{
break;
}
//移動兩個輔助指針
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (NULL == pCurrent)
{
return;
}
//重新建立待刪除節點的前驅和後繼結點關係
pPrev->next = pCurrent->next;
//釋放刪除節點內存
free(pCurrent);
pCurrent = NULL;
}
//遍歷
void Foreach_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//輔助指針變量
struct LinkNode *pCurrent = header->next;
while (pCurrent != NULL)
{
printf("%d ",pCurrent->data);
pCurrent = pCurrent->next;
}
}
//銷燬
void Destroy_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//輔助指針變量
struct LinkNode *pCurrent = header;
while (pCurrent != NULL)
{
//先保存下當前結點的下一個節點地址
struct LinkNode *pNext = pCurrent->next;
//釋放當前結點內存
printf("%d節點被銷燬!\n", pCurrent->data);
free(pCurrent);
//指針向後移動
pCurrent = pNext;
}
}
//清空
void Clear_LinkList(struct LinkNode *header)
{
if (NULL == header)
{
return;
}
//輔助指針變量
struct LinkNode *pCurrent = header->next;
while (pCurrent != NULL)
{
//先保存下當前結點的下一個節點地址
struct LinkNode *pNext = pCurrent->next;
//釋放當前結點內存
free(pCurrent);
//pCurrent指向下一個節點
pCurrent = pNext;
}
header->next = NULL;
}
測試鏈表 TestLinkList.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"LinkList.h"
void test()
{
//初始化鏈表 100 200 666 300 400 500 600
struct LinkNode *header = Init_LinkList();
//打印鏈表
Foreach_LinkList(header);
//插入數據
InsertByValue_LinkList(header, 200, 666);
//打印鏈表
printf("\n-------------------\n");
Foreach_LinkList(header);
//清空鏈表
Clear_LinkList(header);
//打印鏈表
InsertByValue_LinkList(header, 1000, 111);
InsertByValue_LinkList(header, 1000, 211);
InsertByValue_LinkList(header, 1000, 311);
InsertByValue_LinkList(header, 1000, 411);
printf("\n-------------------\n");
Foreach_LinkList(header);
RemoveByValue_LinkList(header,311);
printf("\n-------------------\n");
Foreach_LinkList(header);
RemoveByValue_LinkList(header, 211);
printf("\n-------------------\n");
Foreach_LinkList(header);
//銷燬鏈表
Destroy_LinkList(header);
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}