|
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;
}
他们是对的,应该是 sizeof(Node) 而非 sizeof(Node *)
|
最佳答案
查看完整内容
他们是对的,应该是 sizeof(Node) 而非 sizeof(Node *)
|