1.定义单链表
#include<stdio.h>
struct LNode {
int data;
struct LNode* next;
}Lnode, * LinkList;
int main() {
typedef struct LNode Lode;
typedef struct LinkList *LinkList;
Lode* L;
LinkList L;
return 0;
}
2.初始化单链表
#include <stdio.h>
#include <stdbool.h>
typedef struct LNode {
int data;
struct LNode* next;
} Lnode, * LinkList;
bool InitList(LinkList* L) {
*L = NULL;
return true;
}
bool Empty(LinkList L) {
if (L==NULL)
{
return true;
}
else
{
return false;
}
}
int main() {
LinkList L;
InitList(&L);
return 0;
}
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} Lnode, * LinkList;
bool InitList(LinkList* L) {
*L = (Lnode*)malloc(sizeof(Lnode));
if (*L == NULL) {
return false;
}
(*L)->next = NULL;
return true;
}
int main() {
LinkList L;
if (InitList(&L)) {
printf("链表初始化成功\n");
}
else {
printf("链表初始化失败\n");
}
return 0;
}
3.判断是否为空
#include<stdio.h>
typedef struct LNode{
int data;
struct LNode *next;
}Lnode,*LinkList;
int ListEmpty(LinkList L) {
if (L->next)
{
return 0;
}
else {
return 1;
}
}
int main() {
Lnode head;
head.next = NULL;
int isEmpty=ListEmpty(&head);
printf("判断是否为空:%d\n",isEmpty);
return 0;
}
4.单链表销毁
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
}Lnode, * LinkList;
int DestroyList_L(LinkList* L) {
Lnode* p;
Lnode* current = *L;
while (current != NULL) {
p = current;
current = current->next;
free(p);
}
*L = NULL;
return 0;
}
int main() {
LinkList L = (LinkList)malloc(sizeof(Lnode));
if (L == NULL) {
printf("内存分配失败\n");
return -1;
}
L->next = NULL;
DestroyList_L(&L);
if (L == NULL) {
printf("链表已经成功销毁\n");
}
return 0;
}
5.清空链表
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
}*LinkList,Lnode;
int ClearList(LinkList L) {
Lnode* p, * q;
p = L->next;
while (p) {
q = p->next;
free(p);
p = q;
}
L->next = NULL;
return 0;
}
int main() {
LinkList L = (LinkList)malloc(sizeof(Lnode));
if (L==NULL)
{
printf("内存分配失败!!!\n");
return L;
}
L->next = NULL;
ClearList(L);
printf("链表清空成功\n");
free(L);
L = NULL;
return 0;
}
6.求链表的表长
/*
* 求链表的表长
*
* 思路:从首元节点开始,依次计数所有节点
*/
typedef struct LNode {
int data
struct LNode* next
} LNode, * LinkList
int ListLength_L(LinkList L) {
LinkList p = L->next
int i = 0
// 遍历单链表,统计节点数
while (p != NULL) {
i++
p = p->next
}
return i
}
int main() {
// 初始化链表头节点(分配动态存储)
LinkList L = (LinkList)malloc(sizeof(LNode))
if (L == NULL) {
printf("内存分配失败")
return 1
}
// 置空链表(头节点的next为NULL)
L->next = NULL
// 添加测试节点
// 创建第一个节点
LinkList node1 = (LinkList)malloc(sizeof(LNode))
node1->data = 10
node1->next = NULL
L->next = node1
// 创建第二个节点
LinkList node2 = (LinkList)malloc(sizeof(LNode))
node2->data = 20
node2->next = NULL
node1->next = node2
// 创建第三个节点
LinkList node3 = (LinkList)malloc(sizeof(LNode))
node3->data = 30
node3->next = NULL
node2->next = node3
// 测试:调用ListLength_L函数获取链表长度
printf("链表长度: %d\n", ListLength_L(L))
// 释放所有节点
free(node3)
free(node2)
free(node1)
free(L)
return 0
}
7.单链表取值
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, * LinkList;
int GetElem_L(LinkList L, int i, int *e) {
LinkList p;
p = L->next;
int j = 1;
while (p != NULL && j < i) {
p = p->next;
++j;
}
if (!p || j > i) {
return 0;
} else {
*e = p->data;
return 1;
}
}
int main() {
LinkList L = (LinkList)malloc(sizeof(LNode));
if (L == NULL) {
printf("内存分配失败\n");
return 1;
}
L->data = 0;
L->next = NULL;
printf("链表初始化成功\n");
int e;
int result = GetElem_L(L, 10, &e);
if (result) {
printf("获取元素成功,值为: %d\n", e);
} else {
printf("获取元素失败\n");
}
free(L);
return 0;
}
8.1单链表查找——按值查找(地址)
/*
* 按值查找————根据指定数据获取该数据所在的位置(地址)
*
* 【算法步骤】
1.从第一个结点起,依次和e相比较。
2.如果找到一个其值与e相等的数据元素,则返回其在链表中的
"位置"或地址
3.如果查遍整个链表都没有找到其值和e相等的元素,则返回0或
"NULL"
*/
typedef struct LNode {
int data
struct LNode* next
} LNode, *LinkList
// 按值查找函数:在链表L中查找值为e的节点,找到则返回节点地址,否则返回NULL
LinkList LocateElem_L(LinkList L, int e) {
LinkList p = L->next
// 遍历链表查找值为e的节点
while (p != NULL && p->data != e) {
p = p->next
}
// 如果找到则返回节点地址,否则返回NULL
return p
}
// 辅助函数:在链表头部插入新节点
void InsertNode(LinkList L, int data) {
LinkList newNode = (LinkList)malloc(sizeof(LNode))
newNode->data = data
newNode->next = L->next
L->next = newNode
}
int main() {
// 初始化动态分配内存
LinkList L = (LinkList)malloc(sizeof(LNode))
// 检查内存分配是否成功
if (L == NULL) {
printf("内存分配失败\n")
return 1
}
// 初始化头节点
L->data = 0
L->next = NULL
// 添加测试数据
InsertNode(L, 30)
InsertNode(L, 20)
InsertNode(L, 10)
// 测试按值查找
int searchValue = 20
LinkList result = LocateElem_L(L, searchValue)
if (result != NULL) {
printf("找到值为 %d 的节点,地址为: %p\n", searchValue, result)
} else {
printf("未找到值为 %d 的节点\n", searchValue)
}
// 测试查找不存在的值
searchValue = 50
result = LocateElem_L(L, searchValue)
if (result != NULL) {
printf("找到值为 %d 的节点,地址为: %p\n", searchValue, result)
} else {
printf("未找到值为 %d 的节点\n", searchValue)
}
// 释放内存
LinkList current = L
while (current != NULL) {
LinkList temp = current
current = current->next
free(temp)
}
return 0
}
8.2单链表查找——按序查找(位序)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *LinkList;
int LocateElem_L(LinkList L, int e) {
LinkList p = L->next;
int position = 1;
while (p != NULL && p->data != e) {
p = p->next;
position++;
}
if (p != NULL) {
return position;
} else {
return 0;
}
}
void AppendNode(LinkList L, int data) {
LinkList newNode = (LinkList)malloc(sizeof(LNode));
newNode->data = data;
newNode->next = NULL;
LinkList p = L;
while (p->next != NULL) {
p = p->next;
}
p->next = newNode;
}
int main() {
LinkList L = (LinkList)malloc(sizeof(LNode));
if (L == NULL) {
printf("内存分配失败\n");
return 1;
}
L->data = 0;
L->next = NULL;
AppendNode(L, 10);
AppendNode(L, 20);
AppendNode(L, 30);
AppendNode(L, 40);
int searchValue = 30;
int position = LocateElem_L(L, searchValue);
if (position != 0) {
printf("找到值为 %d 的节点,位置序号为: %d\n", searchValue, position);
} else {
printf("未找到值为 %d 的节点\n", searchValue);
}
searchValue = 50;
position = LocateElem_L(L, searchValue);
if (position != 0) {
printf("找到值为 %d 的节点,位置序号为: %d\n", searchValue, position);
} else {
printf("未找到值为 %d 的节点\n", searchValue);
}
LinkList current = L;
while (current != NULL) {
LinkList temp = current;
current = current->next;
free(temp);
}
return 0;
}
9.单链表插入
/*
* 插入在第i个结点前插入值为e的新结点
1、首先找到
a i-1的存储位置p。
2、生成一个数据域为e的新结点s。
3、插入新结点:
1.新结点的指针域指向结点ai;
2.结点a
*/
typedef struct LNode {
int data
struct LNode* next
} LNode, *LinkList
// 在链表L的第i个位置前插入值为e的新节点
int ListInsert_L(LinkList L, int i, int e) {
LinkList p = L
int j = 0
// 查找第i-1个节点,p指向i-1节点
while (p && j < i - 1) {
p = p->next
++j
}
// i大于表长+1或小于1,插入位置非法
if (!p || j > i - 1) {
return 0
}
// 生成新节点s
LinkList s = (LinkList)malloc(sizeof(LNode))
if (!s) {
printf("内存分配失败\n")
return 0
}
s->data = e
s->next = p->next
p->next = s
return 1
}
// 辅助函数:在链表尾部添加节点(用于测试)
void AppendNode(LinkList L, int data) {
LinkList newNode = (LinkList)malloc(sizeof(LNode))
newNode->data = data
newNode->next = NULL
// 找到链表尾部
LinkList p = L
while (p->next != NULL) {
p = p->next
}
// 在尾部插入新节点
p->next = newNode
}
// 辅助函数:打印链表
void PrintList(LinkList L) {
LinkList p = L->next
printf("链表内容: ")
while (p != NULL) {
printf("%d ", p->data)
p = p->next
}
printf("\n")
}
int main() {
// 初始化动态分配存储空间
LinkList L = (LinkList)malloc(sizeof(LNode))
// 检查分配内存是否成功
if (L == NULL) {
printf("内存分配失败")
return 1
}
// 初始化头节点
L->data = 0
L->next = NULL
// 添加测试数据
AppendNode(L, 10)
AppendNode(L, 20)
AppendNode(L, 30)
printf("插入前:\n")
PrintList(L)
// 在第2个位置插入值为15的新节点
if (ListInsert_L(L, 2, 15)) {
printf("在第2个位置插入15成功\n")
} else {
printf("插入失败\n")
}
printf("插入后:\n")
PrintList(L)
// 释放内存
LinkList current = L
while (current != NULL) {
LinkList temp = current
current = current->next
free(temp)
}
return 0
}
10.单链表删除
typedef struct LNode {
int data
struct LNode* next
} LNode, *LinkList
// 删除链表L的第i个节点,并将删除的值保存在e中
int ListDelete_L(LinkList L, int i, int *e) {
LinkList p = L
int j = 0
// 查找第i-1个节点
while (p && j < i - 1) {
p = p->next
++j
}
// 如果p为空或位置不合理,返回错误
if (!p || !p->next || j > i - 1) {
return 0
}
// 找到要删除的节点
LinkList q = p->next
*e = q->data
p->next = q->next
free(q)
return 1
}
// 辅助函数:在链表尾部添加节点(用于测试)
void AppendNode(LinkList L, int data) {
LinkList newNode = (LinkList)malloc(sizeof(LNode))
newNode->data = data
newNode->next = NULL
// 找到链表尾部
LinkList p = L
while (p->next != NULL) {
p = p->next
}
// 在尾部插入新节点
p->next = newNode
}
// 辅助函数:打印链表
void PrintList(LinkList L) {
LinkList p = L->next
printf("链表内容: ")
while (p != NULL) {
printf("%d ", p->data)
p = p->next
}
printf("\n")
}
int main() {
// 初始化链表头节点
LinkList L = (LinkList)malloc(sizeof(LNode))
if (L == NULL) {
printf("内存分配失败\n")
return 1
}
// 初始化头节点
L->data = 0
L->next = NULL
// 添加测试数据
AppendNode(L, 10)
AppendNode(L, 20)
AppendNode(L, 30)
AppendNode(L, 40)
printf("删除前:\n")
PrintList(L)
// 删除第3个节点
int deletedValue
if (ListDelete_L(L, 3, &deletedValue)) {
printf("删除第3个节点成功,删除的值为: %d\n", deletedValue)
} else {
printf("删除失败\n")
}
printf("删除后:\n")
PrintList(L)
// 释放内存
LinkList current = L
while (current != NULL) {
LinkList temp = current
current = current->next
free(temp)
}
return 0
}
11.1单链表建立——头插法
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, * LinkList;
void CreateList_Head(LinkList L, int n) {
for (int i = n; i > 0; i--) {
LinkList p = (LinkList)malloc(sizeof(LNode));
printf("请输入第%d个元素的值: ", n - i + 1);
scanf("%d", &p->data);
p->next = L->next;
L->next = p;
}
}
void PrintList(LinkList L) {
LinkList p = L->next;
printf("链表内容: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L = (LinkList)malloc(sizeof(LNode));
if (L == NULL) {
printf("分配内存失败");
return 1;
}
L->data = 0;
L->next = NULL;
CreateList_Head(L,5);
PrintList(L);
LinkList current = L;
while (current != NULL) {
LinkList temp = current;
current = current->next;
free(temp);
}
return 0;
}
11.2链表建立——尾插法
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode,*LinkList;
void CreateList_tail(LinkList L,int n) {
LinkList r = (LinkList)malloc(sizeof(LNode));
r = L;
for (int i = 1; i <= n; i++)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = NULL;
r->next = p;
r = p;
}
}
void PrintList(LinkList L) {
LinkList p = L->next;
printf("链表内容:");
while (p!=NULL) {
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L = (LinkList)malloc(sizeof(LNode));
if (L==NULL)
{
printf("内存分配失败");
return 1;
}
L->data = 0;
L->next = NULL;
CreateList_tail(L,5);
PrintList(L);
free(L);
return 0;
}
12.循环链表
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *LinkList;
LinkList Connect(LinkList Ta, LinkList Tb) {
LinkList p;
p = Ta->next;
Ta->next = Tb->next->next;
Tb->next->next = p;
free(Tb);
return Ta;
}
void InitCircularList(LinkList L) {
L->next = L;
L->data = 0;
}
void AppendNode(LinkList rear, int data) {
LinkList newNode = (LinkList)malloc(sizeof(LNode));
newNode->data = data;
newNode->next = rear->next;
rear->next = newNode;
}
void PrintCircularList(LinkList rear) {
if (rear == NULL) return;
LinkList head = rear->next;
LinkList p = head->next;
printf("循环链表内容: ");
while (p != head) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList Ta = (LinkList)malloc(sizeof(LNode));
LinkList Tb = (LinkList)malloc(sizeof(LNode));
if (Ta == NULL || Tb == NULL) {
printf("内存分配失败");
return 1;
}
InitCircularList(Ta);
InitCircularList(Tb);
AppendNode(Ta, 10);
AppendNode(Ta, 20);
AppendNode(Ta, 30);
AppendNode(Tb, 40);
AppendNode(Tb, 50);
AppendNode(Tb, 60);
printf("合并前:\n");
printf("Ta: ");
PrintCircularList(Ta);
printf("Tb: ");
PrintCircularList(Tb);
LinkList result = Connect(Ta, Tb);
printf("合并后:\n");
PrintCircularList(result);
LinkList current = result->next;
LinkList head = result->next;
LinkList temp;
do {
temp = current;
current = current->next;
free(temp);
} while (current != head);
return 0;
}
13.双向链表
typedef struct DuLNode {
int data;
struct DuLNode* prior;
struct DuLNode* next;
}DuLNode,*DuLinkList;
#include<stdio.h>
int main() {
return 0;
}