怎么做
  1. 题面里的虚线方框就是要填的空
  2. 点候选项,它会填进当前高亮的那个空
  3. 点已填好的空,可以把选项取回来重选
  4. 全部填满后「提交」才会亮起
卡住了就点右下角的 👩‍🏫 问 AI 老师,她会给提示但不直接给答案。

带头结点的链表:h 后面才是数据

👁️ 32 人浏览 💬 0 人评论 ❤️ 添加收藏

带头结点的链表:h 指向一个不存数据的头结点

h

头结点

→

7

→

2

→ NULL

头结点的 data 不用

第一个数据结点是 h->next

二级的链表题,链表前面常常多一个头结点:它不存数据,只负责「站岗」。h 指向头结点,真正的第一个数据在 h->next。 这样插入、删除第一个数据结点时,改的是 h->next,h 本身永远不变,不用再为「最前面」单独写一段。

#include <stdio.h>
#include <stdlib.h>

typedef struct list {
    int data;
    struct list *next;
} SLIST;

/* 用 a[0]~a[n-1] 建一条带头结点的链表,返回头结点的地址 */
SLIST *creat(int a[], int n)
{
    SLIST *h, *p, *q;
    int i;
    h = p = (SLIST *)malloc(sizeof(SLIST));
    h->data = 0;
    for (i = 0; i < n; i++) {
        q = (SLIST *)malloc(sizeof(SLIST));
        q->data = a[i];
        p->next = q;
        p = q;
    }
    p->next = NULL;
    return h;
}

/* 输出所有数据结点;没有数据结点输出「空」 */
void outlist(SLIST *h)
{
    SLIST *p = h->next;
    if (p == NULL)
        printf("空");
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

/* 释放整条链表(含头结点) */
void freelist(SLIST *h)
{
    SLIST *q;
    while (h != NULL) {
        q = h->next;
        free(h);
        h = q;
    }
}

int main(void)
{
    int a[3] = {4, 6, 9};
    SLIST *h, *p, *q;
    int s = 0;
    h = creat(a, 3);
    p = h->next;
    while (p != NULL) {
        s += p->data;
        p = p->next;
    }
    printf("%d %d\n", h->next->data, s);
    q = h->next;              /* 删掉第一个数据结点 */
    h->next = q->next;
    free(q);
    outlist(h);
    freelist(h);
    return 0;
}

程序第一行输出【0】和【1】;第二行输出的第一个数是【2】;删掉第一个数据结点时,h 的值【3】改变。

请登录后作答。
去登录
👩‍🏫
AI
💬 题目评论
🔒 登录并作答后可看讨论