C语言 实现单链表 增删改查 尾插法
// 带头结点单链表
# include <stdio.h>
# include <stdlib.h>
// 定义结构体
typedef struct LNode {
// 数据域
int data;
// 指针域 指向一个节点 节点类型的指针(涉及地址划分)
struct LNode *next;
}Node, *NodeList;
// 初始化单链表(带头结点)
bool InitList(NodeList &L){
// 分配空间
L = (Node *)malloc(sizeof(Node));
// 判断是否正常获取空间
if (L==NULL) {
return false;
}
// 正常分配则指针域置为空
L->next = NULL;
return true;
}
// 向链表添加10个元素
void addNode(NodeList &L) {
// 尾插法 新建尾指针
Node *end = L;
for (int i=0;i<10;i++) {
// 新申请空间 指针保存
Node *a = (Node *)malloc(sizeof(Node));
// 数据域保存 指针用-> 变量用.
a->data = i;
// 指针域为空
a->next = NULL;
// 上一节点的指针为新节点
end->next = a;
// 新节点变为
end = a;
}
}
// 在链表的第k个位置插入元素e
int InsertList(NodeList &L, int k, int e) {
Node *head = L->next;
// 计算链表的长度
Node *len_head = L->next;
// 长度变量
int i = 0;
while(len_head != NULL) {
len_head = len_head->next;
i++;
}
printf("\n链表长度:%d\n", i);
if ((k<1)||(k>i+1)) {
return 101;
} else {
// 插入元素
// 分 第一位置 ,>1 位置
// 新建一个节点
Node *aa = (Node *)malloc(sizeof(Node));
// 数据域
aa->data = e;
if (k==1) {
aa->next = L->next;
L->next = aa;
return 202;
}else {
// 遍历到这个节点的上一节点
for (int j=0;j<k-2;j++) {
head = head->next;
}
// 指针域
aa->next = head->next;
// 上一节点的
head->next = aa;
return 202;
}
}
}
// 计算链表的长度
int GetLength(NodeList &L) {
Node *head = L->next; // 头结点后的节点
int i = 0;
// 遍历单链表
while (head != NULL) {
head = head->next;
i++;
}
return i;
}
// 删除链表元素
// 第k个位置的 e元素
bool Deletelist(NodeList &L, int k, int &e) {
// 判断k是否合法
int Llength = 0;
Llength = GetLength(L);
if ((k<1)||(k>Llength)) {
return false;
}
Node *head = L->next;
// 删除第一个元素
if (k==1) {
Node *c = head;
e = head->data;
L->next = head->next;
free(c);
return true;
} else {
// 删除>1
for (int j=0;j<k-2;j++) {
head = head->next;
}
// 中间指针
Node *c = head->next;
e = head->next->data;
head->next = head->next->next;
free(c);
return true;
}
}
// 查找元素
int LookupList(NodeList &L, int e) {
Node *head = L->next;
int i = 0;
bool tt = true;
while((head->next!=NULL)&&(tt)) {
int kkk = head->data;
if (kkk==e){
tt = false;
}
head = head->next;
i++;
}
if (tt==true) {
return -1;
}
return i;
}
// 更改第k个元素的值为e
bool UpdateList(NodeList &L, int k, int e) {
// 查看k值是否合法
// 当前链表长度
int xx = GetLength(L);
if ((k<1)||(k>xx)) {
return false;
} else {
Node *head = L->next;
for (int j=0;j<k-1;j++) {
head = head->next;
}
head->data = e;
return true;
}
}
int main() {
// 创建单链表 头指针
NodeList L;
// 初始化链表 (带头节点)
InitList(L);
// 向L插入10个元素
addNode(L);
// 查看单链表的元素 利用头指针 所有节点的指针均为 Node类型
Node *cc = L->next; // 头节点后开始保存元素
for (int i=0;i<10;i++) {
int L_data = cc->data;
printf("%d - > ", L_data);
// 遍历指针变为下一节点指针
cc = cc->next;
}
// 位置 元素
// if(InsertList(L, 13, 0)) {
// printf("插入成功\n");
// }else {
// printf("插入失败\n");
// }
int ddd = InsertList(L, 11, 88);
if (ddd == 101) {
printf("返回代码: %d: 插入位置溢出\n ", ddd);
} else if (ddd == 202) {
printf("返回代码: %d:插入成功\n", ddd);
}
Node *ccc = L->next;
int g=0;
while(ccc != NULL) {
int kkk = ccc->data;
ccc = ccc->next;
g++;
}
printf("\n当前单链表长度: %d\n", g);
// Node *eee = L->next->next;
// int fff = eee->data;
// printf("%d - > ", fff);
// 删除
int e = -1;
if (Deletelist(L, 5, e)) {
printf("\n删除成功元素: %d\n", e);
}else {
printf("删除失败\n");
}
Node *qqq = L->next;
int gg = 0;
while(qqq != NULL) {
int kkk = qqq->data;
printf("%d - > ", kkk);
qqq = qqq->next;
gg++;
}
printf("\n链表长度: %d\n", gg);
// 查找元素 k 在第e位置
int kkc = 5;
printf("\n元素%d 在第 %d的位置\n", kkc,LookupList(L, kkc));
// 修改元素
printf("\n修改第5个元素为999\n");
UpdateList(L, 1, 999);
Node *ppp = L->next;
int uu = 0;
while(ppp != NULL) {
int yyy = ppp->data;
printf("%d - > ", yyy);
ppp = ppp->next;
uu++;
}
printf("\n链表长度: %d\n", uu);
return 0;
}