怎么做
- 题面里的虚线方框就是要填的空
- 点候选项,它会填进当前高亮的那个空
- 点已填好的空,可以把选项取回来重选
- 全部填满后「提交」才会亮起
卡住了就点右下角的 👩🏫 问 AI 老师,她会给提示但不直接给答案。
带头结点的链表:h 后面才是数据
带头结点的链表: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
💬 题目评论
🔒
登录并作答后可看讨论