怎么做
- 题面里的虚线方框就是要填的空
- 点候选项,它会填进当前高亮的那个空
- 点已填好的空,可以把选项取回来重选
- 全部填满后「提交」才会亮起
卡住了就点右下角的 👩🏫 问 AI 老师,她会给提示但不直接给答案。
插入与删除:先连后断
插入新结点 s:先连后面,再接前面
p
后一个
s
────→
↗
↘
① s->next = p->next;
② p->next = s;
链表插入、删除不用像数组那样挪一大片,只要改几个 next:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
};
/* 尾插法:用 a[0]~a[n-1] 建一条链表,返回头指针(上一关学过) */
struct node *create(int a[], int n)
{
struct node *head = NULL, *tail = NULL, *p;
int i;
for (i = 0; i < n; i++) {
p = (struct node *)malloc(sizeof(struct node));
p->data = a[i];
p->next = NULL;
if (head == NULL)
head = p;
else
tail->next = p;
tail = p;
}
return head;
}
/* 输出整条链表;空链表输出「空」 */
void print_list(struct node *head)
{
struct node *p;
if (head == NULL)
printf("空");
for (p = head; p != NULL; p = p->next)
printf("%d ", p->data);
printf("\n");
}
/* 释放整条链表 */
void free_list(struct node *head)
{
struct node *q;
while (head != NULL) {
q = head->next;
free(head);
head = q;
}
}
int main(void)
{
int a[4] = {1, 2, 3, 4};
struct node *head, *p, *s, *q;
head = create(a, 4);
p = head->next; /* p 指向 2 */
s = (struct node *)malloc(sizeof(struct node));
s->data = 9;
s->next = p->next; /* 插入:先连后面 */
p->next = s; /* 再接前面 */
q = s->next; /* q 指向要删的结点 */
s->next = q->next; /* 删除:先绕过它 */
free(q); /* 再释放 */
print_list(head);
free_list(head);
return 0;
}
- 插入(把 s 插到 p 后面):
s->next = p->next;让 s 先指向 p 原来的后一个,再p->next = s;。两句不能对调。 - 删除(删掉 p 后面那个):
q = p->next; p->next = q->next; free(q);——先让链绕过它,再释放。 - 插在最前面、删掉第一个时,没有「前一个」,要改的是
head本身,这是最容易漏的边界。
程序输出【0】。如果把插入的两句对调成 p->next = s; s->next = p->next;,s->next 会指向【1】。被删掉的结点要用【2】还给系统。
请登录后作答。
去登录
👩🏫
AI
💬 题目评论
🔒
登录并作答后可看讨论