VS2019 ——单链表操作.exe 已触发了一个断点问题?

断点如下:

全部代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<stdbool.h>
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node* next;
}Node, LinkList;
void Show_meau()   //菜单
{
    printf("**********************************\n");
    printf("            WELCOME!\n");
    printf("\n");
    printf("\t单链表的基本操作\n\n");
    printf("  \t 1.查询\t 2.插入\n\n");
    printf("  \t 3.删除\t 4.打印\n\n");
    printf("  \t 5.计数\t 6.销毁\n\n");
    printf("  \t 7.退出\t 8.建表\n\n");
    printf("\n");
    printf("     输入相关序号实现相关功能!\n");
    printf("**********************************\n");
}
void InitList(LinkList* L)
{
    L = (LinkList*)malloc(sizeof(Node));
    L->next = NULL;
}
void Create_List(LinkList* L)   //尾插法
{
    ElemType c;
    Node* r, * s;
    bool flag=true;
    r = L;
    printf("提示:输入$表示建表结束!\n");
    while (flag==true)
    {
        c = getchar();
        if (c != '$')
        {
            s = (LinkList*)malloc(sizeof(Node));
            s->data = c;
            r->next = s;
            r = s;
        }
        else
        {
            flag = false;
            r->next = NULL;
        }
    }
    printf("建表完成!\a");
    Sleep(2000);
}
void Search(LinkList* L)
{
    int flag=1;
    Node* p;
    ElemType e;
    getchar();   //吸收换行符
    p = L->next;
    printf("请输入要查找的值:");
    e = getchar();
    while (p != NULL)
    {
        if (p->data != e)
            p = p->next;
        else
        {
            printf("该地址为:%p\n", p);
            printf("输入0退出!\n");
            scanf("%d", &flag);
            break;
        }
    }
    if (flag == 0)
        return;
    printf("查无此值!\a");
    Sleep(2000);
}
void DispList(LinkList* L)
{
    int n;
    LinkList* p = L->next;
    printf("打印值为:\n");
    while (p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\n\n");
    while (1) {
        printf("输入0退出打印!\n");
        scanf("%d", &n);
        if (n == 0)
            return;
        else
            printf("输入无效,请重新输入!\n");
    }
}
int ListLength(LinkList *L)
{
    int n = 0;
    LinkList* p = L;
    while (p->next != NULL)
    {
        n++;
        p=p->next;
    }
    n--;
    return n;
}
void Print_Length(LinkList* L)
{
    int n = 1;
        while (1)
        {
            if (n == 1)
            {
                printf("表长为:%d\n", ListLength(L));
                printf("输入0退出打印!\n");
                scanf("%d", &n);
            }
            if (n == 0)
                return;
        }
}
void ListInsert(LinkList* L)
{
    int i,j=0;
    ElemType e;
    LinkList* p = L, * s;
    printf("当前表长为:%d\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入插入的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\n");
        }
        else
            break;
    }
    getchar();
    printf("请输入插入的值:");
    scanf("%c", &e);
    while (j < i  && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\n");
        Sleep(2000);
        return;
    }
    else
    {
        s = (LinkList*)malloc(sizeof(Node));
        s->data = e;
        s->next = p->next;
        p->next = s;
        printf("插入成功!\a");
        Sleep(2000);
    }
}
void ListDelete(LinkList* L)
{
    int i, j = 0;
    ElemType e;
    LinkList* p = L, * q;
    printf("当前表长为:%d\n", ListLength(L));  //注意指针L
    while (1)
    {
        printf("请输入删除值的位置:");
        scanf("%d", &i);
        if (i <= 0 || i > ListLength(L))
        {
            printf("输入错误!请重新输入!\n");
        }
        else
            break;
    }
    getchar();
    while (j < i && p != NULL)
    {
        j++;
        p = p->next;
    }
    if (p == NULL)
    {
        printf("查无此值!\n");
        Sleep(2000);
        return;
    }
    else
    {
        q = p->next;
        if (p == NULL)
        {
            printf("查无此值!\n");
            Sleep(2000);
            return;
        }
        e = q->data;
        p->next = q->next;
        free(q);
        printf("删除成功!\a");
        Sleep(2000);
    }
}
void DestroyList(LinkList* L)
{
    LinkList* pre = L, * p = L->next;
    while (p != NULL)   //逐一释放
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
    printf("销毁成功!\a");
    Sleep(2000);
}
int main()
{
    int n;
    LinkList L;
    InitList(&L);
    while (1) {
        system("cls");    //清屏函数
        Show_meau();
        printf("请输入1-8的数:");
        scanf("%d", &n);
        switch (n) {
        case 1:
            Search(&L);
            break;
        case 2:
            ListInsert(&L);
            break;
        case 3:
            ListDelete(&L);
            break;
        case 4:
            DispList(&L);
            break;
        case 5:
            Print_Length(&L);
            break;
        case 6:
            DestroyList(&L);
            break;
        case 7:
            printf("........正在退出中........");
            Sleep(3000);
            system("cls");
            printf("\a退出成功!"),
                exit(0);
            break;
        case 8:
            Create_List(&L);
            break;
        default:
            printf("\a输入错误!请重新输入(1—8)!"),
                Sleep(2000);
            break;
        }
    }
    return 0;
}
阅读 4.3k
1 个回答

错误原因:在主函数中,头结点L是位于栈上的一段内存空间,并非是由malloc()分配来的,在DestroyList()函数中,尝试free()该结点,所以产生了该问题。

解决方案:在主函数中,将L声明为LinkList*类型,并对InitList()函数进行部分修改,有如下两种修改方案:

1.将InitList()的参数类型修改为LinkList**,将该函数体内对L的使用替换为*L
2.将InitList()设置为ListLink* InitList(void),在主函数中将该函数的返回值赋给L
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进