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

插入与删除:先连后断

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

插入新结点 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
💬 题目评论
🔒 登录并作答后可看讨论