#include <stdio.h> // 引入标准输入输出头文件
#include <stdlib.h> // 引入标准库函数头文件,用于malloc等函数
// 定义元素类型为整型
typedef int ElemType;
// 定义链表结点结构体
typedef struct LNode{
ElemType data; // 结点数据域
struct LNode *next; // 指向下一个结点的指针
} LNode, *LinkList; // LinkList是LNode类型的指针别名
// 头插法创建链表
void ListHeadInsert(LinkList &L){
L = (LinkList)malloc(sizeof(LNode)); // 创建头结点
L->next = NULL; // 初始化头结点的next为NULL
ElemType x; // 读取用户输入的数据
scanf("%d", &x); // 第一次输入数据
LNode *s; // 创建新结点的指针
while(x != 9999){ // 输入9999作为结束标志
s = (LinkList)malloc(sizeof(LNode)); // 分配内存
s->data = x; // 设置数据域
s->next = L->next; // 新结点插入到头结点后面
L->next = s; // 更新头结点的next指针
scanf("%d", &x); // 再次输入数据
}
}
// 尾插法创建链表
void ListTailInsert(LNode* &L){
L = (LinkList)malloc(sizeof(LNode)); // 创建头结点
L->next = NULL; // 初始化头结点的next为NULL
ElemType x; // 读取用户输入的数据
scanf("%d", &x); // 第一次输入数据
LNode *s, *r = L; // 创建新结点的指针和尾指针
while(x != 9999){ // 输入9999作为结束标志
s = (LinkList)malloc(sizeof(LNode)); // 分配内存
s->data = x; // 设置数据域
r->next = s; // 新结点追加到尾部
r = s; // 更新尾指针
scanf("%d", &x); // 再次输入数据
}
r->next = NULL; // 最后一个结点的next设为NULL
}
// 打印链表中的所有元素
void PrintList(LinkList L){
L = L->next; // 移动到第一个实际数据结点
while(L != NULL){
printf("%3d", L->data); // 输出结点数据
L = L->next; // 移动到下一个结点
}
printf("\n"); // 换行
}
// 获取指定位置的结点
LinkList GetElem(LinkList L, int SearchPos){
int i = 0;
if(SearchPos < 0) // 检查索引是否有效
return NULL;
while(L && i < SearchPos){
L = L->next; // 遍历链表直到找到位置
i++;
}
return L;
}
// 查找具有给定值的结点
LinkList LocateElem(LinkList L, int SearchVal){
while(L){
if(L->data == SearchVal) // 如果找到匹配的值则返回该结点
return L;
L = L->next; // 否则继续遍历
}
return NULL;
}
// 在指定位置前插入一个元素
bool ListFrontInsert(LinkList L, int InsertPos, ElemType InsertVal){
LinkList p = GetElem(L, InsertPos - 1); // 找到插入位置的前一个结点
if(NULL == p) // 如果找不到前一个结点,则插入失败
return false;
LinkList q; // 创建新结点
q = (LinkList)malloc(sizeof(LNode));
q->data = InsertVal; // 设置新结点的数据域
q->next = p->next; // 插入新结点
p->next = q;
return true;
}
// 删除指定位置的元素
bool ListDelete(LinkList L, int Pos){
LinkList p = GetElem(L, Pos - 1); // 找到删除位置的前一个结点
if(!p) // 如果找不到前一个结点,则删除失败
return false;
LinkList q = p->next; // 要删除的结点
p->next = q->next; // 绕过要删除的结点
free(q); // 释放内存
return true;
}
// 主函数
int main(){
LinkList L, search;
//ListHeadInsert(L); // 使用头插法创建链表
ListTailInsert(L); // 使用尾插法创建链表
//PrintList(L); // 打印链表
//printf("--------------------\n");
PrintList(L); // 再次打印链表以确认创建成功
bool ret = ListFrontInsert(L, 2, 66); // 在指定位置前插入元素
if(ret){
printf("Insert Success\n");
PrintList(L); // 打印更新后的链表
}
else{
printf("Insert Fail\n");
}
search = GetElem(L, 2); // 查找指定位置的结点
if(search)
printf("Value of element is %d\n", search->data);
else
printf("This element does not exist\n");
search = LocateElem(L, 0); // 查找具有给定值的结点
if(search)
printf("Value of element is %d\n", search->data);
else
printf("This element does not exist\n");
ret = ListDelete(L, 100); // 删除指定位置的元素
if(!ret)
printf("Delete Fail\n");
else
printf("Delete Success\n");
PrintList(L); // 打印最终的链表状态
scanf("%d"); // 防止程序立即退出
return 0;
}