当前位置: 首页 > news >正文

探索链表的奥秘:C语言中的查找操作与链表打印

目录

链表的基本结构

头插法

打印链表

按位置查找

按值查找

主函数

查找操作

示例运行

输出示例

总结


在数据结构的学习中,链表是一种非常重要的线性结构。它的动态特性使得在插入和删除操作时比数组更为高效。今天,我们将继续探讨链表的操作,特别是如何在链表中进行查找操作,并打印链表的内容。通过这篇博客,你将更深入地理解链表的实现和操作。

链表的基本结构

在C语言中,链表的基本结构由节点(Node)构成,每个节点包含数据部分和指向下一个节点的指针。我们首先定义一个链表节点的结构体:

typedef int ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList;

这里,ElemType定义了节点中存储的数据类型,而LNode结构体则包含了数据和指向下一个节点的指针。

头插法

我们之前已经实现了头插法的插入操作。头插法是将新节点插入到链表的头部。以下是头插法的实现:

void list_head_insert(LinkList &L) {
    L = (LinkList) malloc(sizeof(LinkList)); // 申请头结点空间
    L->next = NULL;
    ElemType x;
    scanf("%d", &x);
    LinkList s; // 用来指向申请的新结点
    while (x != 9999) {
        s = (LinkList) malloc(sizeof(LinkList));
        s->data = x;
        s->next = L->next; // s 的next指向原本链表的第一个结点
        L->next = s; // 头结点的 next 指向新结点
        scanf("%d", &x);
    }
}

在这个函数中,我们首先创建一个头节点,然后通过循环读取用户输入的数据,直到输入9999为止。每次读取到一个新数据时,我们都会创建一个新节点,并将其插入到链表的头部。

打印链表

为了验证我们的链表操作是否成功,我们需要一个函数来打印链表的内容:

void print_list(LinkList L) {
    L = L->next; // 跳过头结点
    while (L != NULL) {
        printf("%d ", L->data);
        L = L->next;
    }
    printf("\n");
}

这个函数从头节点的下一个节点开始遍历链表,打印每个节点的数据。

按位置查找

我们实现了一个按位置查找的函数,返回指定位置的节点:

LinkList GetElem(LinkList &L, ElemType pos) {
    int i = 0;
    if (pos < 0) {
        return NULL; // 如果位置不合法,返回NULL
    }
    while (L && i < pos) {
        L = L->next; // 遍历链表
        i++;
    }
    return L; // 返回指定位置的节点
}

在这个函数中,我们通过遍历链表,返回指定位置的节点指针。如果位置不合法(如负数),则返回NULL

按值查找

除了按位置查找,我们还实现了一个按值查找的函数,返回第一个匹配的节点:

LinkList LocateElem(LinkList L, ElemType value) {
    while (L) {
        if (L->data == value) { // 找到对应的值 返回对应结点的地址
            return L;
        }
        L = L->next; // 继续遍历
    }
    return NULL; // 如果没有找到,返回NULL
}

这个函数遍历链表,查找第一个与给定值匹配的节点。如果找到,则返回该节点的指针;如果没有找到,则返回NULL

主函数

最后,我们在main函数中调用这些操作,构建链表并进行查找操作:

int main() {
    LinkList L; // L 是链表头指针
    list_head_insert(L); // 传递头指针的地址
    print_list(L); // 打印链表

    LinkList search = GetElem(L, 2); // 查找位置为 2 的元素
    if (search != NULL) {
        printf("Element at position 2: %d\n", search->data);
    } else {
        printf("No element found at position 2.\n");
    }

    search = LocateElem(L, 4); // 查找值为 4 的元素
    if (search != NULL) {
        printf("Element with value 4: %d\n", search->data);
    } else {
        printf("No element found with value 4.\n");
    }

    return 0;
}

main函数中,我们首先定义一个链表L,然后调用list_head_insert函数来填充链表。接着,我们使用print_list函数打印链表的内容,以验证插入操作的正确性。

查找操作

  1. 按位置查找:我们调用GetElem函数查找位置为2的元素。根据链表的结构,返回的节点将是链表中第二个元素的指针。如果该位置存在,我们将打印该元素的值;如果不存在,则输出相应的提示信息。

  2. 按值查找:我们调用LocateElem函数查找值为4的元素。该函数会遍历链表,查找第一个匹配的节点。如果找到,我们将打印该节点的值;如果没有找到,则输出相应的提示信息。

示例运行

假设用户输入以下数据来创建链表:

10
20
30
40
9999

在这种情况下,链表的初始状态为:40 -> 30 -> 20 -> 10。接着,我们进行查找操作:

  • 查找位置为2的元素,返回的结果将是30
  • 查找值为4的元素,由于链表中没有值为4的节点,输出将是“没有找到值为4的元素”。

输出示例

假设用户输入了上述数据,程序的输出将类似于:

40 30 20 10 
Element at position 2: 30
No element found with value 4.

总结

通过这篇博客,我们深入探讨了链表的基本操作,包括头插法、打印链表、按位置查找和按值查找。链表的灵活性使得它在许多应用中都非常有用,尤其是在需要频繁插入和删除操作的场景中。

希望这篇文章能帮助你更好地理解链表的实现和操作。如果你有任何问题或想法,欢迎在评论区留言讨论!链表的世界充满了可能性,继续探索吧!

相关文章:

  • 为什么要使用前缀索引,以及建立前缀索引:sql示例
  • python中如何把dataframe转换为列表及其性能比较
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)
  • 【氮化镓】高输入功率应力诱导的GaN 在下的退化LNA退化
  • 【C】初阶数据结构9 -- 直接插入排序
  • Compose 实践与探索二 —— 状态订阅与自动更新1
  • Blueprint —— 蓝图技术指南
  • 初始化E9环境,安装Sqlserver数据库
  • 分布式事务的原理
  • 贪心算法精解:用C++征服最优解问题
  • 数据链路层 (以太帧 MAC地址 ARP协议)
  • 基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Liunx(CentOS-6-x86_64)使用Nginx部署Vue项目
  • 水下机器人推进器PID参数整定与MATLAB仿真
  • 同步模式之顺序控制,如何控制三个线程依次输出: abc abc abc abc abc?
  • 本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件
  • 无刷电动智能充气泵方案【天吉智芯】
  • 【软件逆向】QQ 连连看小游戏去广告与一键消除实现
  • 数据量过大的时候导出数据很慢
  • 蓝桥杯备赛-基础训练(四)字符串 day17
  • 中国公民免签赴马来西亚的停留天数如何计算?使馆明确
  • 国铁:今天预计发送旅客2110万人次,加开列车1896列
  • 中南财经政法大学法学院党委副书记易育去世,终年45岁
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台社媒
  • 美国加州州长:加州继续对中国“敞开贸易大门”
  • “彩虹滑道”项目两男童相撞飞跌出去,景区:工作人员误判导致