C语言:链表运用(一)
发布日期:2021-05-07 07:21:51 浏览次数:23 分类:精选文章

本文共 4592 字,大约阅读时间需要 15 分钟。

链表操作实例解析

链表的输出

链表的输出是一种常见操作,主要用于遍历链表节点并将节点的数据逐个打印出来。以下是实现链表输出的代码示例:

#include 
struct Test { int data; struct Test *next;};void printLink(struct Test *head) { struct Test *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } putchar('\n');}int main() { struct Test t1 = {1, NULL}; struct Test t2 = {2, NULL}; struct Test t3 = {3, NULL}; t1.next = &t2; t2.next = &t3; printLink(&t1); return 0;}

代码解释:

  • printLink 函数用于打印链表的所有节点数据。它从链表的头节点开始遍历,逐个打印每个节点的数据,直到遍历到最后一个节点。
  • main 函数创建了三个节点,并将它们按顺序连接成链表。然后调用 printLink 函数打印链表的内容。

链表的个数、查找

  • 链表的节点总数统计统计链表中节点的总数可以通过遍历链表节点,逐个计数实现。以下是统计节点总数的代码:
  • struct Test {    int data;    struct Test *next;};void printLink(struct Test *head) {    struct Test *p = head;    while (p != NULL) {        printf("%d ", p->data);        p = p->next;    }    putchar('\n');}int getLinkTotalNodeNum(struct Test *head) {    int cnt = 0;    struct Test *p = head;    while (p != NULL) {        cnt++;        p = p->next;    }    return cnt;}int main() {    struct Test t1 = {1, NULL};    struct Test t2 = {2, NULL};    struct Test t3 = {3, NULL};    t1.next = &t2;    t2.next = &t3;    printLink(&t1);    printf("节点总数:%d\n", getLinkTotalNodeNum(&t1));    return 0;}

    代码解释:

    • getLinkTotalNodeNum 函数通过遍历链表节点,逐个递增计数器 cnt,直到遍历完所有节点后返回节点总数。
    • main 函数创建链表并调用 getLinkTotalNodeNum 函数统计节点总数,打印结果。
    1. 链表查找查找链表中的节点可以通过遍历链表节点,逐个比较节点数据,直到找到目标节点或遍历完所有节点。以下是查找节点的代码:
    2. struct Test {    int data;    struct Test *next;};void printLink(struct Test *head) {    struct Test *p = head;    while (p != NULL) {        printf("%d ", p->data);        p = p->next;    }    putchar('\n');}int searchLink(struct Test *head, int data) {    struct Test *p = head;    while (p != NULL) {        if (p->data == data) {            return 1;        }        p = p->next;    }    return 0;}int main() {    struct Test t1 = {1, NULL};    struct Test t2 = {2, NULL};    struct Test t3 = {3, NULL};    t1.next = &t2;    t2.next = &t3;    printLink(&t1);    printf("查找结果:%d\n", searchLink(&t1, 5));    return 0;}

      代码解释:

      • searchLink 函数通过遍历链表,逐个比较节点数据,直到找到目标节点或返回 0 表示未找到。
      • main 函数打印链表内容并调用 searchLink 函数查找节点,打印查找结果。

      链表的后插、前插

      链表插入操作是链表编程中的常见操作,包括前插和后插两种方式。以下是链表插入的代码示例:

      #include 
      struct Test { int data; struct Test *next;};void printLink(struct Test *head) { struct Test *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } putchar('\n');}int insertFromBehind(struct Test *head, struct Test *newNode, int data) { struct Test *p = head; while (p != NULL) { if (p->data == data) { newNode->next = p->next; p->next = newNode; return 1; } p = p->next; } return 0;}struct Test* inserFromFront(struct Test *head, struct Test *newNode, int data) { struct Test *p = head; if (p->data == data) { newNode->next = p; return newNode; } while (p->next != NULL) { if (p->next->data == data) { newNode->next = p->next; p->next = newNode; return head; } p = p->next; } return head;}int main() { struct Test *head = NULL; struct Test t1 = {1, NULL}; struct Test t2 = {2, NULL}; struct Test t3 = {3, NULL}; struct Test new_node = {6, NULL}; struct Test new_node2 = {89, NULL}; t1.next = &t2; t2.next = &t3; head = &t1; insertFromBehind(head, &new_node, 2); printLink(head); head = inserFromFront(head, &new_node2, 2); printLink(head); return 0;}

      代码解释:

      • insertFromBehind 函数通过遍历链表,找到目标数据节点的后一个位置,将新节点插入到该位置。
      • inserFromFront 函数通过遍历链表,找到目标数据节点的前一个位置,将新节点插入到该位置。
      • main 函数创建链表并调用上述插入函数,打印插入后的链表内容。

      链表的删除

      链表删除操作需要谨慎处理,确保删除操作不会导致链表断裂或内存泄漏。以下是链表删除的代码示例:

      struct Test {    int data;    struct Test *next;};struct Test* deleteNode(struct Test *head, int data) {    struct Test *p = head;    struct Test *p2 = NULL;    if (p->data == data) {        head = head->next;        // p不是动态分配的内存,通常不需要释放        return head;    }    while (p->next != NULL) {        if (p->next->data == data) {            p2 = p->next;            p->next = p->next->next;            return head;        }        p = p->next;    }    return head;}int main() {    struct Test *head = NULL;    struct Test t1 = {1, NULL};    struct Test t2 = {2, NULL};    struct Test t3 = {3, NULL};    t1.next = &t2;    t2.next = &t3;    head = &t1;    head = deleteNode(head, 3);    printLink(head);    return 0;}

      代码解释:

      • deleteNode 函数通过遍历链表,找到目标节点并删除它。需要注意的是,链表的每个节点都是动态分配的,删除时需要正确处理指针。
      • main 函数创建链表并调用 deleteNode 函数删除指定节点,打印删除后的链表内容。

      这些代码示例展示了链表的常用操作,包括输出、统计节点数、查找、插入(前后)和删除等功能。

    上一篇:[转]JavaScript 初学者教程(指南)
    下一篇:Xshell-设置命令行提示符&配色方案

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年05月18日 19时05分31秒