C语言实现线性表的链式表示,创建,插入,查找,删除

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jenson20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值