愿你 发表于 2018-4-2 09:48:05

为什么我执行完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:23

目测是删了未分配的椎空间

愿你 发表于 2018-4-2 10:54:01

BngThea 发表于 2018-4-2 09:54
目测是删了未分配的椎空间

可是销毁不就是要把从头到尾把每一个结点都释放掉吗??

BngThea 发表于 2018-4-2 11:06:44

是不是你的链表尾部不为NULL?

人造人 发表于 2018-4-2 11:58:33



多了一个 -842150451 吧,那么请问 -842150451 从何而来?

愿你 发表于 2018-4-2 15:47:45

BngThea 发表于 2018-4-2 11:06
是不是你的链表尾部不为NULL?

我是循环链表,尾部不是应该指向头结点吗{:10_285:}

愿你 发表于 2018-4-2 15:48:36

人造人 发表于 2018-4-2 11:58
多了一个 -842150451 吧,那么请问 -842150451 从何而来?

这个842150451是什么东西....{:10_243:}

人造人 发表于 2018-4-2 15:56:12

愿你 发表于 2018-4-2 15:48
这个842150451是什么东西....

愿你 发表于 2018-4-2 15:59:05

人造人 发表于 2018-4-2 15:56


可是头结点的数据域不是可以不写吗
销毁不是从头结点一个一个销毁吗

BngThea 发表于 2018-4-2 16:09:27

愿你 发表于 2018-4-2 15:47
我是循环链表,尾部不是应该指向头结点吗

原来你的头节点根本没放数据,怎么能free

愿你 发表于 2018-4-2 16:13:52

BngThea 发表于 2018-4-2 16:09
原来你的头节点根本没放数据,怎么能free

为什么没有数据就不可以free。{:10_284:}

人造人 发表于 2018-4-2 16:42:47

愿你 发表于 2018-4-2 16:13
为什么没有数据就不可以free。




好吧,和1234没有任何关系,以后不要写这种让人误解的代码,头结点的数据域没有初始化,我的本能告诉我这里有问题^_^,其实这个问题不会导致这个程序崩溃,其他的我就不保证了,所以,还是尽量把改初始化的都初始化了





好了,现在来看看你程序的问题
请问,什么时候while循环会停止?
也就是说*L什么时候会是0 ?
0表示假,0会使while循环停止
那么,什么时候*L会是0 ?

愿你 发表于 2018-4-2 20:35:22

人造人 发表于 2018-4-2 16:42
好吧,和1234没有任何关系,以后不要写这种让人误解的代码,头结点的数据域没有初始化,我的本能告 ...

这个问题把我难住了{:10_266:}
因为是循环链表,所以我不可以先释放头结点?因为如果我先释放头结点,我尾节点是指向头结点的,那么我找不到终止循环的条件
是这样吗

人造人 发表于 2018-4-2 20:48:03

愿你 发表于 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 22:04:19

人造人 发表于 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 22:13:47

人造人 发表于 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-3 08:36:21

愿你 发表于 2018-4-2 22:13
我才发现论坛有这个功能

发完整代码

愿你 发表于 2018-4-3 20:16:29

人造人 发表于 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 22:04:04

愿你 发表于 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]
查看完整版本: 为什么我执行完destroy函数会出现这个框??