用指针处理链表
标签: C语言
学习人数: 9.5k

什么是链表

在前面的例子中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占用的空间从数组中释放出来。

用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。

可在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域内又存放第三个结点的首地址,如此串连下去直到最后一个结点。最后一个结点因无后续结点连接,其指针域可赋为 0。这样一种连接方式,在数据结构中称为“链表”。

下图为最一简单链表的示意图。

图中,第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号num,姓名 name,性别 sex 和成绩 score 等。另一个域为指针域,存放下一结点的首地址。链表中的每一个结点都是同一种结构类型。

例如,一个存放学生学号和成绩的结点应为以下结构:

 struct stu {  
    int num;  
    int score;  
    struct stu *next;  
}  

 

前两个成员项组成数据域,后一个成员项 next 构成指针域,它是一个指向 stu 类型结构的指针变量。

链表的基本操作对链表的主要操作有以下几种:

1. 建立链表;

2. 结构的查找与输出;

3. 插入一个结点;

4. 删除一个结点;

下面通过例题来说明这些操作。

 

【例】建立一个三个结点的链表,存放学生数据。为简单起见, 我们假定学生数据结构中只有学号和年龄两项。可编写一个建立链表的函数 creat。程序如下:

#define NULL 0  
#define TYPE struct stu  
#define LEN sizeof (struct stu)  
struct stu {  
    int num;  
    int age;  
    struct stu *next;  
};  
  
TYPE *creat(int n) {  
    struct stu *head, *pf, *pb;  
    int i;  
    for(i = 0; i < n; i++) {  
        pb = (TYPE*) malloc(LEN);  
        printf("input Number and Age\n");  
        scanf("%d%d", &pb->num, &pb->age);  
        if(i == 0) ...
登录查看完整内容


课后作业

掌握本节内容


登录后开始许愿

2 条上岸许愿
公交车呢
2024年3月7日 20:24

struct Student* create() {  
    n = 0;  
    struct Student *head;  
    struct Student *p1, *p2;  
    p1 = p2 = (struct Student *)malloc(sizeof(Student));  
    scanf("%d,%f", &p1->num, &p1->score);  
    head = NULL;  
    while (p1->num != 0) {  
        n = n + 1;  
        if (n == 1) head = p1;  
        else p2->next = p1;  
        p2 = p1;  
        p1 = (struct Student *)malloc(sizeof(Student));  
        scanf("%d,%f", &p1->num, &p1->score);  
    }
    p2->next=NULL;//尾指针必须指向NULL  
    return head;  
};

赞(0)
公交车呢
2024年3月7日 20:13

逆天代码

赞(0)