为什么我执行完destroy函数会出现这个框??
销毁到底是什么意思?执行销毁之后,正常程序应该出现什么情况?
# include<stdio.h>
# include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
void initlist(Linklist *L)
{
(*L)=(Linklist)malloc(sizeof(LNode));
if(!(*L))
printf("对不起,无法进行地址分配哦~\n");
(*L)->next=*L;
printf("初始化成功 ~\n");
}
void creatlist(Linklist *L)//尾插法
{
int n,i;
Linklist r;//指向尾节点
r=*L;
printf("请输入需要的元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
Linklist p=malloc(sizeof(LNode));
if(!p)
printf("对不起,无法正常分配空间哦\n");
else
{
printf("请输入第%d个元素",i+1);
scanf("%d",&p->data);
p->next=*L;
r->next=p;
r=p;
}
}
}
void showlist(Linklist *L)
{
Linklist p;
p=(*L)->next;
if((*L)->next==*L)
printf("循环链表中没有元素哦,无法显示。\n");
else
{
while(p!=(*L))
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
void destroylist(Linklist *L)
{
Linklist p;
while(*L)
{
p=(*L)->next;
free(*L);
*L=p;
}
}
void lengthlist(Linklist *L)
{
Linklist p;
int length=0;
p=(*L)->next;
while(p!=(*L))
{
length++;
p=p->next;
}
printf("您的循环链表长度为%d\n",length);
}
int main()
{
Linklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
lengthlist(&L);
destroylist(&L);
showlist(&L);
return 0;
} 目测是删了未分配的椎空间 BngThea 发表于 2018-4-2 09:54
目测是删了未分配的椎空间
可是销毁不就是要把从头到尾把每一个结点都释放掉吗??
是不是你的链表尾部不为NULL?
多了一个 -842150451 吧,那么请问 -842150451 从何而来?
BngThea 发表于 2018-4-2 11:06
是不是你的链表尾部不为NULL?
我是循环链表,尾部不是应该指向头结点吗{:10_285:} 人造人 发表于 2018-4-2 11:58
多了一个 -842150451 吧,那么请问 -842150451 从何而来?
这个842150451是什么东西....{:10_243:} 愿你 发表于 2018-4-2 15:48
这个842150451是什么东西....
人造人 发表于 2018-4-2 15:56
可是头结点的数据域不是可以不写吗
销毁不是从头结点一个一个销毁吗 愿你 发表于 2018-4-2 15:47
我是循环链表,尾部不是应该指向头结点吗
原来你的头节点根本没放数据,怎么能free BngThea 发表于 2018-4-2 16:09
原来你的头节点根本没放数据,怎么能free
为什么没有数据就不可以free。{:10_284:} 愿你 发表于 2018-4-2 16:13
为什么没有数据就不可以free。
好吧,和1234没有任何关系,以后不要写这种让人误解的代码,头结点的数据域没有初始化,我的本能告诉我这里有问题^_^,其实这个问题不会导致这个程序崩溃,其他的我就不保证了,所以,还是尽量把改初始化的都初始化了
好了,现在来看看你程序的问题
请问,什么时候while循环会停止?
也就是说*L什么时候会是0 ?
0表示假,0会使while循环停止
那么,什么时候*L会是0 ?
人造人 发表于 2018-4-2 16:42
好吧,和1234没有任何关系,以后不要写这种让人误解的代码,头结点的数据域没有初始化,我的本能告 ...
这个问题把我难住了{:10_266:}
因为是循环链表,所以我不可以先释放头结点?因为如果我先释放头结点,我尾节点是指向头结点的,那么我找不到终止循环的条件
是这样吗 愿你 发表于 2018-4-2 20:35
这个问题把我难住了
因为是循环链表,所以我不可以先释放头结点?因为如果我先释放头结点, ...
# include<stdio.h>
# include<stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *Linklist;
void initlist(Linklist *L)
{
(*L) = (Linklist)malloc(sizeof(LNode));
if(!(*L))
printf("对不起,无法进行地址分配哦~\n");
(*L)->next = *L;
printf("初始化成功 ~\n");
(*L)->data = 1234;
}
void creatlist(Linklist *L)//尾插法
{
int n, i;
Linklist r;//指向尾节点
r = *L;
printf("请输入需要的元素个数:");
scanf("%d", &n);
for(i = 0; i<n; i++)
{
Linklist p = malloc(sizeof(LNode));
if(!p)
printf("对不起,无法正常分配空间哦\n");
else
{
printf("请输入第%d个元素", i + 1);
scanf("%d", &p->data);
p->next = *L;
r->next = p;
r = p;
}
}
}
void showlist(Linklist *L)
{
Linklist p;
p = (*L)->next;
if((*L)->next == *L)
printf("循环链表中没有元素哦,无法显示。\n");
else
{
while(p != (*L))
{
printf("%d ", p->data);
p = p->next;
}
}
printf("\n");
}
int lengthlist(Linklist *L)
{
Linklist p;
int length = 0;
p = (*L)->next;
while(p != (*L))
{
length++;
p = p->next;
}
printf("您的循环链表长度为%d\n", length);
return length;
}
void destroylist(Linklist *L)
{
Linklist p;
int len = lengthlist(L);
for(int i = 0; i < len + 1; ++i)
{
p = (*L)->next;
free(*L);
*L = p;
}
}
int main()
{
Linklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
lengthlist(&L);
destroylist(&L);
//showlist(&L);
return 0;
} 人造人 发表于 2018-4-2 20:48
我照你的程序代码改了
可是程序还是停止工作
void destroylist(Linklist *L)//销毁链表
{
Linklist p;
int len=lengthlist(&L);
int i;
for(i=0;i<len;i++)
{
p=(*L)->next;
free(*L);
*L=p;
}
}
int lengthlist(Linklist *L) //求链表长度
{
Linklist p;
int length=0;
p=(*L)->next;
while(p!=(*L))
{
length++;
p=p->next;
}
printf("您的循环链表长度为%d\n",length);
return length;
}
人造人 发表于 2018-4-2 20:48
我才发现论坛有这个功能{:10_245:}
void destroylist(Linklist *L)//销毁链表
{
Linklist p;
int len=lengthlist(&L);
int i;
for(i=0;i<len;i++)
{
p=(*L)->next;
free(*L);
*L=p;
}
}
int lengthlist(Linklist *L) //求链表长度
{
Linklist p;
int length=0;
p=(*L)->next;
while(p!=(*L))
{
length++;
p=p->next;
}
printf("您的循环链表长度为%d\n",length);
return length;
}
愿你 发表于 2018-4-2 22:13
我才发现论坛有这个功能
发完整代码 人造人 发表于 2018-4-3 08:36
发完整代码
我把destroy函数改了下,但还是会出现程序停止运行的框
那究竟怎么样才算程序已经把销毁工作完成??
# include<stdio.h>
# include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*Linklist;
void initlist(Linklist *L) //初始化链表
{
(*L)=(Linklist)malloc(sizeof(LNode));
if(!(*L))
printf("对不起,无法进行地址分配哦~\n");
(*L)->next=*L;
printf("初始化成功 ~\n");
}
void creatlist(Linklist *L)//尾插法创建链表
{
int n,i;
Linklist r;//指向尾节点
r=*L;
printf("请输入需要的元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
Linklist p=malloc(sizeof(LNode));
if(!p)
printf("对不起,无法正常分配空间哦\n");
else
{
printf("请输入第%d个元素",i+1);
scanf("%d",&p->data);
p->next=*L;
r->next=p;
r=p;
}
}
}
void showlist(Linklist *L) //显示链表
{
Linklist p;
p=(*L)->next;
if((*L)->next==*L)
printf("循环链表中没有元素哦,无法显示。\n");
else
{
while(p!=(*L))
{
printf("%d ",p->data);
p=p->next;
}
}
printf("\n");
}
/*void destroylist(Linklist *L)//销毁链表
{
Linklist p;
int len=lengthlist(&L);
int i;
for(i=0;i<len;i++)
{
p=(*L)->next;
free(*L);
*L=p;
}
printf("您的链表已被销毁~\n");
}*/
int destroylist(Linklist *L)
{
Linklist p,pnext,p1=(*L)->next;
for(p=p1;p->next!=p1;p=pnext)
{
pnext=p->next;
free(p);
}
free(*L);
printf("您的链表已被销毁~\n");
return 0;
}
int lengthlist(Linklist *L) //求链表长度
{
Linklist p;
int length=0;
p=(*L)->next;
while(p!=(*L))
{
length++;
p=p->next;
}
printf("您的循环链表长度为%d\n",length);
return length;
}
void clearlist(Linklist *L)//清空链表
{
Linklist p,q;
p=(*L)->next;
while(p!=(*L))
{
q=p->next;
free(p);
p=q;
}
p->next=(*L);
}
void isempty(Linklist *L) //判断表是否为空
{
if((*L)->next==(*L))
printf("该链表为空\n");
else
printf("该链表不为空~\n");
}
void locateelemlist(Linklist *L) //根据元素内容判断元素位置
{
int e,i=0;
Linklist p;
printf("请输入您想要查询的元素内容:");
scanf("%d",&e);
p=(*L)->next;
if((*L)->next==*L)
printf("循环链表中没有元素哦,无法查询。\n");
while(p->next!=(*L))
{
i++;
if(p->data==e)
printf("您查询的元素内容%d是第%d号元素\n",e,i);
p=p->next;
}
}
void getelemlist(Linklist *L) //根据元素位置查找元素内容。
{
int i=0,e,j;
Linklist p=(*L)->next;
printf("请输入您想要查询的元素位置:");
scanf("%d",&j);
if((*L)->next==*L)
printf("循环链表中没有元素哦,无法查询。\n");
else
{
while(p!=(*L))
{
i++;
if(i==j)
{
e=p->data;
printf("您所要查询的位置的元素内容为%d\n",e);
break;
}
p=p->next;
}
if(i!=j)
printf("尚未查询到您所需要的元素。\n");
}
}
void insertlist(Linklist *L)//将指定的元素位置之前插入一个元素
{
int j,i,e;
Linklist p,s;
p=*L;
j=0;
printf("请输入您想要在几号元素之前插入什么元素内容");
scanf("%d,%d",&i,&e);
while(p->next!=(*L)&&j<i-1)
{
p=p->next;
j++;
}
if(!p||j>i-1)
printf("对不起插入位置有误。\n");
else
{
s=(Linklist)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
void deletelist(Linklist *L)
{
int i,j;
Linklist p,q;
p=*L;
j=0;
printf("请问您想要在删除哪一号元素:");
scanf("%d",&i);
while(p->next!=(*L)&&j<i-1)
{
p=p->next;
j++;
}
if(!p&&j>i-1)
printf("对不起删除位置有误\n");
else
{
q=p->next;
p->next=q->next;
}
}
int main()
{
Linklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
lengthlist(&L);
destroylist(&L);
//locateelemlist(&L);
lengthlist(&L);
showlist(&L);
//getelemlist(&L);
/*insertlist(&L);
showlist(&L);
deletelist(&L);
showlist(&L);
clearlist(&L);
showlist(&L);*/
return 0;
} 愿你 发表于 2018-4-3 20:16
我把destroy函数改了下,但还是会出现程序停止运行的框
那究竟怎么样才算程序已经把销毁工作完成??
...
# include<stdio.h>
# include<stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *Linklist;
void initlist(Linklist *L) //初始化链表
{
(*L) = (Linklist)malloc(sizeof(LNode));
if(!(*L))
printf("对不起,无法进行地址分配哦~\n");
(*L)->next = *L;
printf("初始化成功 ~\n");
(*L)->data = 1234; // debug
}
void creatlist(Linklist *L)//尾插法创建链表
{
int n, i;
Linklist r;//指向尾节点
r = *L;
printf("请输入需要的元素个数:");
scanf("%d", &n);
for(i = 0; i<n; i++)
{
Linklist p = malloc(sizeof(LNode));
if(!p)
printf("对不起,无法正常分配空间哦\n");
else
{
printf("请输入第%d个元素", i + 1);
scanf("%d", &p->data);
p->next = *L;
r->next = p;
r = p;
}
}
}
void showlist(Linklist *L) //显示链表
{
if(*L == NULL)
return -1;
Linklist p;
p = (*L)->next;
if((*L)->next == *L)
printf("循环链表中没有元素哦,无法显示。\n");
else
{
while(p != (*L))
{
printf("%d ", p->data);
p = p->next;
}
}
printf("\n");
}
/*void destroylist(Linklist *L)//销毁链表
{
Linklist p;
int len=lengthlist(&L);
int i;
for(i=0;i<len;i++)
{
p=(*L)->next;
free(*L);
*L=p;
}
printf("您的链表已被销毁~\n");
}*/
int destroylist(Linklist *L)
{
Linklist p, pnext, p1 = (*L)->next;
for(p = p1; p->next != p1; p = pnext)
{
pnext = p->next;
free(p);
}
free(*L);
printf("您的链表已被销毁~\n");
*L = NULL;
return 0;
}
int lengthlist(Linklist *L) //求链表长度
{
if(*L == NULL)
return -1;
Linklist p;
int length = 0;
p = (*L)->next;
while(p != (*L))
{
length++;
p = p->next;
}
printf("您的循环链表长度为%d\n", length);
return length;
}
void clearlist(Linklist *L)//清空链表
{
Linklist p, q;
p = (*L)->next;
while(p != (*L))
{
q = p->next;
free(p);
p = q;
}
p->next = (*L);
}
void isempty(Linklist *L) //判断表是否为空
{
if((*L)->next == (*L))
printf("该链表为空\n");
else
printf("该链表不为空~\n");
}
void locateelemlist(Linklist *L) //根据元素内容判断元素位置
{
int e, i = 0;
Linklist p;
printf("请输入您想要查询的元素内容:");
scanf("%d", &e);
p = (*L)->next;
if((*L)->next == *L)
printf("循环链表中没有元素哦,无法查询。\n");
while(p->next != (*L))
{
i++;
if(p->data == e)
printf("您查询的元素内容%d是第%d号元素\n", e, i);
p = p->next;
}
}
void getelemlist(Linklist *L) //根据元素位置查找元素内容。
{
int i = 0, e, j;
Linklist p = (*L)->next;
printf("请输入您想要查询的元素位置:");
scanf("%d", &j);
if((*L)->next == *L)
printf("循环链表中没有元素哦,无法查询。\n");
else
{
while(p != (*L))
{
i++;
if(i == j)
{
e = p->data;
printf("您所要查询的位置的元素内容为%d\n", e);
break;
}
p = p->next;
}
if(i != j)
printf("尚未查询到您所需要的元素。\n");
}
}
void insertlist(Linklist *L)//将指定的元素位置之前插入一个元素
{
int j, i, e;
Linklist p, s;
p = *L;
j = 0;
printf("请输入您想要在几号元素之前插入什么元素内容");
scanf("%d,%d", &i, &e);
while(p->next != (*L) && j<i - 1)
{
p = p->next;
j++;
}
if(!p || j>i - 1)
printf("对不起插入位置有误。\n");
else
{
s = (Linklist)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}
void deletelist(Linklist *L)
{
int i, j;
Linklist p, q;
p = *L;
j = 0;
printf("请问您想要在删除哪一号元素:");
scanf("%d", &i);
while(p->next != (*L) && j<i - 1)
{
p = p->next;
j++;
}
if(!p&&j>i - 1)
printf("对不起删除位置有误\n");
else
{
q = p->next;
p->next = q->next;
}
}
int main()
{
Linklist L;
initlist(&L);
creatlist(&L);
showlist(&L);
lengthlist(&L);
destroylist(&L);
//locateelemlist(&L);
lengthlist(&L);
showlist(&L);
//getelemlist(&L);
/*insertlist(&L);
showlist(&L);
deletelist(&L);
showlist(&L);
clearlist(&L);
showlist(&L);*/
return 0;
}
页:
[1]