链表的综合操作(谭浩强经典程序)
### 链表的综合操作(谭浩强经典程序) #### 概述 本文将详细介绍一个基于谭浩强教授的经典程序实现的链表综合操作案例。该程序包含了链表的基本操作,如创建、插入、删除及打印等核心功能。通过本程序的学习与实践,读者可以深入了解链表这一数据结构,并掌握其基本操作方法。 #### 数据结构定义 在程序中,首先定义了一个链表节点结构体`struct student`,其中包含: - `int num`: 存储学生的编号。 - `float score`: 存储学生的分数。 - `struct student *next`: 指向下一个节点的指针。 ```c struct student { int num; float score; struct student* next; }; ``` #### 主函数详解 主函数`main()`是整个程序的入口,主要流程包括: 1. **初始化链表**:调用`creat()`函数创建链表。 2. **打印链表**:调用`print()`函数显示链表内容。 3. **删除节点**:通过用户输入,调用`del()`函数删除指定编号的学生信息。 4. **插入节点**:用户输入待插入的新学生信息,调用`insert()`函数完成插入操作。 5. **重复执行以上步骤**:直到用户不再需要删除或插入数据为止。 ```c void main() { struct student* head = creat(); // 创建链表 print(head); // 打印原始链表 ... } ``` #### 链表创建函数`creat()` 此函数用于创建链表,流程如下: 1. **初始化变量**:定义两个指向`struct student`类型的指针`p1`和`p2`,并分配内存空间。 2. **输入数据**:通过用户输入来填充每个节点的数据部分(学号和分数)。 3. **构建链表**:将新创建的节点添加到链表中,形成链表结构。 4. **返回头结点**:当输入的学号为0时,停止输入并返回链表的头结点地址。 ```c struct student* creat(void) { struct student* head = NULL; struct student* p1, * p2; int n = 0; // 初始化p1和p2 p1 = p2 = (struct student*)malloc(LEN); // 输入第一个节点数据 scanf("%d,%f", &p1->num, &p1->score); while (p1->num != 0) { n++; if (n == 1) head = p1; else p2->next = p1; p2 = p1; p1 = (struct student*)malloc(LEN); scanf("%d,%f", &p1->num, &p1->score); } p2->next = NULL; return head; } ``` #### 删除节点函数`del()` 此函数实现了删除链表中具有特定编号的学生信息的功能: 1. **判断链表是否为空**:如果链表为空,则输出提示信息。 2. **遍历链表**:找到待删除节点及其前一个节点。 3. **删除节点**:更新前一节点的`next`指针,使其指向被删除节点的下一节点。 4. **释放内存**:释放被删除节点占用的内存空间(实际代码中未给出释放操作)。 ```c struct student* del(struct student* head, int del_num) { struct student* p1, * p2; if (head == NULL) { printf("This is a null list!\n"); return head; } p1 = head; while (del_num != p1->num && p1 != NULL) { p2 = p1; p1 = p1->next; } if (del_num == p1->num) { if (p1 == head) head = p1->next; else p2->next = p1->next; printf("delete: %d\n", del_num); } else printf("%d not been found!\n", del_num); return head; } ``` #### 插入节点函数`insert()` 此函数允许用户向链表中插入新的学生信息: 1. **创建新节点**:根据用户输入的数据创建一个新的节点。 2. **定位插入位置**:遍历链表找到合适的位置。 3. **插入节点**:调整指针关系,将新节点插入到链表中的指定位置。 ```c struct student* insert(struct student* head, struct student* stu) { // 实现逻辑略 ... return head; } ``` #### 打印链表函数`print()` 此函数用于遍历链表并打印每个节点的信息。 ```c void print(struct student* head) { struct student* temp = head; while (temp != NULL) { printf("Number: %d, Score: %.2f\n", temp->num, temp->score); temp = temp->next; } } ``` ### 总结 通过上述分析可以看出,这个程序是一个典型的链表操作案例,它涵盖了链表创建、插入、删除和打印等多个方面的内容。对于初学者而言,这是一个非常好的学习示例,可以帮助理解链表的基本概念和常用操作方法。通过实践此类程序,不仅可以巩固对链表的理解,还能提高解决实际问题的能力。
#include<stdlib.h>
#include<malloc.h>
#define LEN sizeof(struct student)
struct student
{
int num;
float score;
struct student *next;
};
void main() //主函数
{
struct student *creat(void);//建立一个动态链表
struct student *del(struct student *head,int del_num);//删除链表
struct student *insert(struct student *head,struct student *stu);//插入链表
void print(struct student *head);//输出链表
struct student *head;
struct student *stu; //要插入的节点
int del_num;
head=creat(); //创建动态链表
print(head); //输出原链表
printf("\n"); //空一格
printf("Input the delete del_num:");
scanf("%d",&del_num);
while(del_num!=0) //多次删除
{
- harrison192012-09-03简单又使用的txt
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助