"这篇内容主要介绍了C语言中的结构体(structure)和单链表的删除算法。在第十一章中,作者首先讲解了结构体的基本概念,如何定义结构体类型以及创建结构体变量。接着,文章重点展示了如何实现单链表的删除操作,通过一个名为`deletesl`的函数来完成。"
在C语言中,结构体是一种非常重要的数据类型,它允许我们将不同类型的变量组合成一个单一的实体,便于管理和操作。在`§11.1`中,作者阐述了结构体的定义方式。`struct`是C语言的关键字,用于声明一个结构体类型。结构体可以包含各种基本数据类型,如整型、字符型、浮点型等,甚至可以嵌套其他结构体或数组。以下是一个简单的结构体示例:
```c
struct student {
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
```
这个`struct student`定义了一个包含学号(num)、姓名(name)、性别(sex)、年龄(age)、分数(score)和地址(addr)的结构体。
在`§11.2`中,作者讨论了如何创建结构体类型的变量。有两种方法:一是先定义结构体类型,然后创建该类型的变量,如`struct student student1, student2;`;二是同时定义类型和变量,如`typedef`关键字的使用。这里,作者还提到了使用符号常量(如`#define STUDENT struct student`)来定义结构体类型和变量,这可以提高代码的可读性和可维护性。
接着,文章转向了单链表的删除算法。单链表是一种线性数据结构,每个元素(节点)包含数据和指向下一个元素的指针。在提供的`deletesl`函数中,它的目的是根据给定的索引`i`从链表中删除指定位置的节点。函数首先遍历链表,找到目标节点的前一个节点`p`,然后更新`p`的`next`指针,使其指向目标节点的下一个节点,最后释放目标节点的内存。如果索引`i`无效,函数会输出错误信息。
这个`deletesl`函数的伪代码如下:
```c
void deletesl(node *h, int i) {
node *p, *s;
int j;
p = h; j = 0;
while (p->next != NULL && j < i - 1) {
p = p->next;
j++;
}
if (j != i - 1) {
printf("i is invalid");
return;
}
s = p->next;
p->next = s->next;
free(s);
}
```
在这个函数中,`p`用于追踪当前节点,`s`用于保存要删除的节点。通过`while`循环,`p`在链表中移动直到找到目标节点的前一个位置。如果索引`i`超出范围,函数会打印错误信息并返回,否则,它会执行删除操作。这种删除算法假设链表的头指针`h`已经初始化,并且`i`是从0开始的索引。