迷途的启木菌 2020-06-27 21:36 采纳率: 50%
浏览 188

链表创建成功后,可以正常的进行创建、和插入数据,但是在执行删除节点之后,链表的数据无法正常输出

链表创建成功后,可以正常的进行创建、和插入数据,但是在执行删除节点之后,链表的数据无法正常输出,在检测时发现,删除节点的函数形参返回后实参错乱,请问怎么解决

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

#define OK 1
#define ERROR 0

typedef int ElenType;/*线性表中存储的数据类型*/

typedef struct Node
{/*线性表的单链表存储结构*/
    ElenType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;/*定义指针*/

void Initialize(LinkList *L)
{
    *L = (LinkList)malloc(sizeof(Node));
    (*L)->next = NULL;
}

void create(LinkList *L)
{
    int i,j=1;
    LinkList p, q;
    p = *L;
    printf("请输入需要初始化的数据个数:");
    scanf_s("%d", &i);
    while (j <= i)
    {
        q = (LinkList)malloc(sizeof(Node)); 
        printf("请输入第%d个数据:",j);
        scanf_s("%d", &q->data);
        p->next = q;
        p = p->next;
        j++;
    }
    p->next = NULL;
}

int Insertion(LinkList *L, int i,ElenType e)
{/*插入数据*/
    int j=1;
    LinkList q, p;
    p = *L;
    while (p&&j < i)
    {/*寻找需要插入的位置*/
        p = p->next;
        ++j;
    }
    if (!p || j > i)
        return ERROR;
    q = (LinkList)malloc(sizeof(Node));
    q->data = e;
    q->next = p->next;
    p->next = q;
    return OK;
}

void InsertionMenu(LinkList *L)
{
    int i, j;
    printf("请输入需要插入的位置");
    scanf_s("%d", &j);
    printf("请输入需要插入的数据:");
    scanf_s("%d", &i);
    Insertion(L, j, i);
}



void Display(LinkList L)
{/*输出链表中的数据*/
    LinkList p = L->next;
    if (!p)
        printf("链表为空!\n");
    else
    {
        while (p)
        {
            printf("%d  ", p->data);
            p = p->next;
        }
        putchar('\n');
    }
}

int Delete(LinkList *L,int i)
{/*删除某个位置上的数据*/
    LinkList q, p;
    int j=1;
    p = *L;
    while (j <= i && p)
    {
        p = p->next;
        j++;
    }
    if (j > i+1 || !p)
        return ERROR;
    q = p;
    p= q->next;
    free(q);
    return OK;
}

void menu()
{
    printf("程序的功能菜单:\n0:菜单\n1:创建链表\n2:插入数据\n3:删除某个位置上的数据\n");
}

int main(void)
{
    int i = 0,j;
    LinkList L;
    while (i != 7)
    {
        switch (i)
        {
        case 0:
            menu();
            break;
        case 1:
            Initialize(&L);
            create(&L);
            printf("链表中的数据为:");
            Display(L);
            break;
        case 2:
            InsertionMenu(&L);
            printf("插入数据后的链表中的数据为:");
            Display(L);
            break;
        case 3:
            printf("请输入需要删除的数据的位置:");
            scanf_s("%d", &j);
            Delete(&L, j);
            printf("删除数据后的链表中的数据为:");
            Display(L);
            break;
        default:
            printf("不存在该功能选项!\n");
            break;
        }
        printf("请输入需要执行的选项:");
        scanf_s("%d", &i);
    }
    printf("感谢您的使用!\n");
    return 0;
}

图片说明

  • 写回答

1条回答 默认 最新

  • 人在旅途QvQ 2020-06-28 09:54
    关注

    用本画一画,就知道怎么回事了。
    答案我更新了。

    int Delete(LinkList *L, int i)
    { /*删除某个位置上的数据*/
        LinkList q, p;
        int j = 1;
        p = *L;
    
        while (j <= i && p)
        {
            p = p->next;
            j++;
        }
    
        if (j > i + 1 || !p)
            return ERROR;
    
        q = p->next;
        p->next = p->next->next;
        free(q);
    
        return OK;
    }
    
    
    评论

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度