鱼C论坛

 找回密码
 立即注册
查看: 1504|回复: 4

[已解决]链表删除结点函数,在free节点时报错

[复制链接]
发表于 2023-11-24 00:10:55 | 显示全部楼层 |阅读模式
5鱼币
才疏学浅,按照书上的示例,自己的思路编写的循环链表的操作函数,其余函数都可以用,在删除链表元素释放结点时,VS报错:
Debug Error!

Program: ...ure\Code\3. CirLinkList\CirLinkList\x64\Debug\CirLinkList.exe

HEAP CORRUPTION DETECTED: after Normal block (#110) at 0x00000215E64C6B30.
CRT detected that the application wrote to memory after end of heap buffer.

在网上搜寻后大概是因为内存溢出,动态分配空间的问题。
但是我怎么也看不出是哪里导致的溢出。希望论坛的大佬赐教。
ps:在Debug模式下运行报错,在release模式下运行不会报错,想知道原因和两者的区别。
感谢!下面是所有的链表功能代码。

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

#define OK 1;
#define ERROR 0;
#define ERROR_1 -1;

#define TRUE 1;
#define FALSE 0;

typedef int ElemType;
typedef struct Node
{
        ElemType data;
        struct  Node* next;
};

typedef struct Node* CirLinkList;
typedef int Status;

static inline int ListLength(CirLinkList L)
{
        CirLinkList p = L->next;
        int length = 0;
        while (p != L)
        {
                p = p->next;
                length++;
        }
        return length;
}

static inline Status InitLinkList(CirLinkList &L)
{
        L = (CirLinkList)malloc(sizeof(Node*));
        if (L)
        {
                L->next = L;
                L->data = ListLength(L);
                return OK;
        }
        return ERROR_1;
}

static inline Status ListEmpty(CirLinkList L)
{
        if (L->next == L)
                return TRUE;
        return FALSE;
}

static inline Status visit(ElemType e)
{
        printf("%d ", e);
        return OK;
}

static inline Status compare(ElemType i,ElemType e)
{
        if (i == e)
                return TRUE;
        return FALSE;
}


static inline Status CreateList_Tail(CirLinkList& L, int n)
{
        if (ListEmpty(L))
        {
                CirLinkList p, r;
                r = L;
                srand(time(0));
                for (int i = 0; i < n; i++)
                {
                        p = (CirLinkList)malloc(sizeof(Node*));
                        if (p)
                        {
                                p->data = rand() % 100 + 1;
                                r->next = p;
                                r = p;
                        }
                        else
                                return ERROR_1;
                }
                r->next = L;
                L->data = ListLength(L);
                return OK;
        }
        else
                return ERROR;
}

static inline Status ListInsert(CirLinkList& L, int i,ElemType e)
{
        CirLinkList p = L;
        if (i < 1 || i > L->data + 1)
        {
                return ERROR;
        }
        for (int j = 0; j < i - 1; j++)
                p = p->next;
        CirLinkList s = (CirLinkList)malloc(sizeof(Node*));
        if (s)
        {
                s->data = e;
                s->next = p->next;
                p->next = s;
                L->data ++;
                return OK;
        }
        return ERROR_1;
}

inline Status ListDelete(CirLinkList& L, int i, ElemType &e)
{
        CirLinkList p = L;
        CirLinkList q;
        if (i < 1 || i > L->data )
        {
                return ERROR;
        }
        for (int j = 0; j < i - 1; j++)
                p = p->next;
        q = p->next;
        p->next = q->next;
        e = q->data;
        free(q);
        L->data--;
        return OK;
}

static inline int LocateElem(CirLinkList L,ElemType e)
{
        CirLinkList p;
        int i = 0;
        for ( p = L->next; p != L; p=p->next )
        {
                i++;
                if (compare(p->data, e))
                        return i;
        }
        return ERROR;
}
static inline Status ListTraverse(CirLinkList L)
{
        if (!ListEmpty(L))
        {
                CirLinkList p = L->next;
                printf("循环链表内容如下:\n");
                while (p != L)
                {
                        visit(p->data);
                        p = p->next;
                }
                printf("\n");
                return OK;
        }
        return ERROR;
}

最佳答案
2023-11-24 00:10:56

他们是对的,应该是 sizeof(Node) 而非 sizeof(Node *)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-11-24 00:32:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-1 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表