链表操作详解:插入与删除

需积分: 6 0 下载量 175 浏览量 更新于2024-09-22 收藏 215KB PDF 举报
"本文将详细介绍链表的基本概念、插入操作和删除操作,以及如何定义一个链表结构。" 链表是一种在计算机科学中常见的数据结构,它与数组不同,不连续存储元素,而是通过节点之间的指针链接。链表中的每个节点包含数据和指向下一个节点的引用。这里我们将探讨链表的插入和删除操作,以及如何定义一个简单的链表结构。 首先,链表的定义通常包括以下几个部分: ```c typedef struct linklist { long i; // 节点的序号或索引 long data; // 存储的数据 struct linklist* next; // 指向下一个节点的指针 } Linklist; ``` 这个结构体`Linklist`定义了链表节点的组成部分,包括一个整型变量`i`用于记录节点的序号,一个`long`类型的`data`用于存储数据,以及一个指向`Linklist`类型的指针`next`,用于连接链表的各个节点。 接下来,我们来看如何生成链表。以下是一个简单的链表生成函数`creat`,它接受用户输入的数据,并创建一个按值排序的链表: ```c Linklist* creat(void) { Linklist* head; // 链表头指针 Linklist* p1, *p2; // 用于遍历和插入的辅助指针 int n = 0; // 记录链表长度 p1 = p2 = (Linklist*)malloc(LEN); // 分配第一个节点 scanf("%ld", &p1->data); // 读取第一个数据 head = NULL; // 初始化头指针为空 while (p1->data >= 0) { // 当数据大于等于0时继续输入 n++; if (n == 1) head = p1; // 如果是第一个节点,设置头指针 else p2->next = p1; // 否则,将前一个节点的next指向当前节点 p2 = p1; // 更新辅助指针p2到当前节点 p2->i = n; // 设置节点的序号 p1 = (Linklist*)malloc(LEN); // 分配新的节点 scanf("%ld", &p1->data); // 读取新的数据 } p2->next = NULL; // 结束输入后,将最后一个节点的next设为NULL return head; // 返回链表头指针 } ``` 链表的输出可以通过`print_linklist`函数实现,该函数遍历整个链表并打印出每个节点的序号和数据: ```c void print_linklist(Linklist* head) { Linklist* p; printf("*Now, These %d records are: *\n", n); p = head; if (head != NULL) do { printf("%-10ld, %10ld\n", p->i, p->data); p = p->next; } while (p != NULL); printf(""); } ``` 链表插入操作可以通过`insert`函数完成,该函数接受要插入的位置`LOCATE`、要插入的值`x`以及链表头`head`作为参数。这里省略了函数的完整实现,但通常的步骤是找到插入位置的前一个节点,然后创建新节点,将新节点插入到正确的位置。 链表的删除操作相对复杂,因为需要找到要删除的节点,并更新它的前一个节点的`next`指针。删除操作通常涉及搜索链表,找到特定位置或特定值的节点,然后进行修改。 总结来说,链表是一种灵活的数据结构,适用于需要频繁插入和删除元素的情况。通过理解和掌握链表的基本操作,如插入和删除,可以更好地设计和实现动态数据结构。