崩溃了,朋友们,好难。

链表结构体表示如下:
typedef int DataType;
typedef struct Lnode
( DataTypedata;
struct Lnode*next;
) ListNode,*LinkList;
实现链表表的创建、插入、删除、输出操作。
(1)LinkList CreateListF2():用头插法创建带头结点的单链表L
(2) void InsList(LinkList head,int i, DataType x):在链表L中的第1个位置上插入元素x
(3) void DelList(LinkList head, int i,DataType *e):删除链表L中的第1个位置的元素
(4) void PrintList_L(LinkList head):输出链表L

咦,链表的增删改查b站有很多视频讲解的很清楚的,多练练慢慢就能理解了

【以下回答由 GPT 生成】

问题解答

(1) 如何优化CreateListF2函数,以实现用头插法创建带头结点的单链表L?

在CreateListF2函数中,使用头插法可以实现用头结点创建单链表。优化代码如下:

LinkList CreateListF2() {
    LinkList L = (LinkList)malloc(sizeof(ListNode));  // 创建头结点
    L->next = NULL;
    DataType x;
    while (scanf("%d", &x) != EOF) {  // 从键盘输入节点的数据,以EOF结束输入
        LinkList p = (LinkList)malloc(sizeof(ListNode));  // 创建新节点
        p->data = x;
        p->next = L->next;
        L->next = p;
    }
    return L;
}

(2) 我在InsList函数中插入元素后,链表没有正确更新,如何解决这个问题?

在InsList函数中,插入元素后需要更新链表连接关系,使得新插入的节点插入到指定位置。具体解决方法如下:

void InsList(LinkList head, int i, DataType x) {
    int j = 0;
    LinkList p = head;
    while (p != NULL && j < i-1) {  // 通过循环找到要插入位置的前一个节点
        p = p->next;
        j++;
    }
    if (p == NULL || j > i-1) {  // 说明要插入位置的前一个节点不存在,即插入位置非法
        printf("插入位置非法!\n");
        return;
    }
    LinkList q = (LinkList)malloc(sizeof(ListNode));  // 创建新节点
    q->data = x;
    q->next = p->next;
    p->next = q;
}

(3) 在DelList函数中,我想删除链表中的元素,但没有得到正确的结果,可能出了什么问题?

在DelList函数中,删除元素后需要更新链表连接关系,使得被删除节点从链表中移除。可能的问题如下:

  • 删除位置非法
  • 需要删除的位置不存在
  • 忘记释放被删除节点的内存

具体解决方法如下:

void DelList(LinkList head, int i, DataType *e) {
    int j = 0;
    LinkList p = head;
    while (p->next != NULL && j < i-1) {  // 通过循环找到要删除位置的前一个节点
        p = p->next;
        j++;
    }
    if (p->next == NULL || j > i-1) {  // 说明要删除位置的节点不存在,即删除位置非法
        printf("删除位置非法或要删除的元素不存在!\n");
        return;
    }
    LinkList q = p->next;  // 被删除节点
    p->next = q->next;  // 更新链表连接关系
    *e = q->data;  // 将被删除节点的数据返回
    free(q);  // 释放被删除节点的内存
}

(4) 当我调用PrintList_L函数时,我得不到预期的链表输出结果,该怎么办?

在PrintList_L函数中,应该使用循环遍历链表中的每个节点,并输出节点的数据值。具体解决方法如下:

void PrintList_L(LinkList head) {
    LinkList p = head->next;  // 第一个有效节点
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

供参考:

#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct Lnode
{
    DataType    data;
    struct Lnode* next;
}ListNode, * LinkList;

LinkList CreateListF2()
{
    DataType  i;
    LinkList  qt = NULL, head = NULL;
    head = (LinkList)malloc(sizeof(ListNode));
    if (!head)
        return NULL;
    head->next = NULL;
    for (; ; )
    {
        scanf("%d", &i);
        if (i == -1)  break; //  -1 结束输入
        qt = (ListNode*)malloc(sizeof(ListNode));
        if (!qt)   break;
        qt->data = i;
        qt->next = head->next;
        head->next = qt;
    }
    return head;
}
void InsList(LinkList head, int i, DataType x)
{
    ListNode* p = head, * s = NULL;
    if (i < 1 || !head)
        return;
    while (p->next && --i)  p = p->next;
    if (i > 1)   return;
    s= (ListNode*)malloc(sizeof(ListNode));
    if (!s)  return;
    s->next = NULL;
    s->data = x;
    s->next = p->next;
    p->next = s;
}
void DelList(LinkList head, int i, DataType* e)
{
    ListNode* p = head, * s = NULL;
    if (i < 1 || !head || !head->next)
        return;
    while (p->next && --i)  p = p->next;
    if (!p->next)
        return;
    s = p->next;
    p->next = s->next;
    *e = s->data;
    free(s);
}
void PrintList(LinkList head)
{
    ListNode* p = NULL;
    if (!head || !head->next)
        printf("NULL");
    else {
        p = head->next;
        while (p != NULL)
        {
            printf(p == head->next ? "%d" : " %d", p->data);
            p = p->next;
        }
    }
    printf("\n");
}
int main()
{
    LinkList L = NULL;
    DataType i = 1, x = 100, e = -100;
    L = CreateListF2();

    InsList(L, i, x);
    
    DelList(L, i, &e);
    printf("Del:%d\n", e);
    
    PrintList(L);
    return 0;
}