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.求链表的表长
#include <stdio.h>
#include <stdlib.h>
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;
}
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;
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单链表查找——按值查找(地址)
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *LinkList;
LinkList LocateElem_L(LinkList L, int e) {
LinkList p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
}
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.单链表插入
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *LinkList;
int ListInsert_L(LinkList L, int i, int e) {
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
++j;
}
if (!p || j > i - 1) {
return 0;
}
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);
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.单链表删除
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
} LNode, *LinkList;
int ListDelete_L(LinkList L, int i, int *e) {
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
++j;
}
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);
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;
}