回 帖 发 新 帖 刷新版面

主题:请教执行到free(q)处为何出错?

我是在VC里面运行这个程序的,功能是:实现带头结点的双向循环链表的构造,建立,输出与销毁,但执行到销毁函数里的free(q)处出错,因此在此请教各位大侠。

程序一开始,输入整型数字,按一次回车,输入一个,输入0时,结束输入,程序段如下:


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

#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define INFEASIBLE -1
#define NULL 0
#define D "%d"    

typedef int ElemType;
typedef int Status;

typedef struct DuLNode{            
    ElemType    data;
    struct DuLNode    *next,*prior;
}DuLNode,*DuLinkList;

Status InitList(DuLinkList &L) {
    DuLNode *p;
    if(!(p=(DuLinkList)malloc(sizeof(DuLinkList)))) return OVERFLOW;
    L=p;
    L->data=NULL;
    L->next=L->prior=L;
    return OK;
}

Status CreatList(DuLinkList &L){
    DuLNode *p,*q;
    ElemType temp;
    if(L->next==L){
        q=L;
        scanf(D,&temp);                //输入0时结束输入
        while(temp){
            if(!(p=(DuLinkList)malloc(sizeof(DuLinkList)))) return OVERFLOW;
            q->next=p;p->data=temp;p->prior=q;q=p;
            scanf(D,&temp);
        }
        p->next=L;L->prior=p;
    }
    else    return ERROR;
    return OK;
}

Status OutList(DuLinkList &L){
    DuLNode *p;
    int i=0;
    p=L->next;
    while(p!=L){
        printf("[%d]:"D"\t",++i,p->data);
        p=p->next;
    }
    return OK;
}

Status DestroyList(DuLinkList &L){
    DuLNode *p,*q;
    p=L->next;
    while(p!=L){
        q=p;p=p->next;free(q);        [color=800000]//执行到free(q)处为何出错?[/color]    }
    free(p);
    L=NULL;
    return OK;
}

void main(){
    DuLinkList L;
    InitList(L);
    CreatList(L);
    OutList(L);
    DestroyList(L);
}

回复列表 (共8个回复)

沙发

我另一段单向链表的销毁程序却没问题,搞不懂
Status DestroyList(LinkList &L){
    LNode *p,*q;
    printf("\n正在销毁单链表……");
    p=L;
    while(p){
        q=p;p=p->next;free(q);
    }
    printf("已成功销毁单链表!\n");
    L=NULL;
    return OK;
}

板凳

while(p!=L){
        q=p;p=p->next;free(q);        //执行到free(q)处为何出错?    }
有问题的
这样的话就使得q的前驱节点与q的后继节点在删除了q节点以后失去了联系,正确的应该是这样的
while(p!=L){
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p)
  p=L->next;
}
  

3 楼

非常fool的错误<joke>:
while(p!=L){
        q=p;p=p->next;free(q);        //执行到free(q)处为何出错?    }
改成:
while(p!=L){
        q=p;p=p->next;free(q);        //执行到free(q)处为何出错?
}           

4 楼

我发贴后研究了几个小时,终于知道哪里错了,我的DestroyList是没有任何问题的,错误在前面这里:

if(!(p=(DuLinkList)malloc(sizeof(DuLinkList)))) return OVERFLOW;

应改为

if(!(p=(DuLinkList)malloc(sizeof(DuLNode)))) return OVERFLOW;

因此在执行free(q)时才会出错。的确是很低级的错误呢,但往往很多错误都是很低级的,明显的错误,一下子就发现拉。

不过还是非常感谢楼上两位朋友的帮忙。

5 楼

开个玩笑嘛

6 楼

互相学习嘛

7 楼

Status InitList(DuLinkList &L)    这样能运行吗?
  DULINKLIST  是指针型的吧  能引用吗?

8 楼

[quote]Status&nbsp;InitList(DuLinkList&nbsp;&L)&nbsp;&nbsp;&nbsp;&nbsp;这样能运行吗?
&nbsp;&nbsp;DULINKLIST&nbsp;&nbsp;是指针型的吧&nbsp;&nbsp;能引用吗?[/quote]

在VC++里可以,在TURBO C 里好像要换一换。

我来回复

您尚未登录,请登录后再回复。点此登录或注册