鱼C论坛

 找回密码
 立即注册
查看: 3083|回复: 2

[已解决]删除链表结点 free 该结点报错

[复制链接]
发表于 2015-1-21 23:09:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1

typedef int Status;
typedef int Elemtype;
typedef struct Node
{
        Elemtype data;
        struct Node *next;
} Node, *LinkList;        //LinkList 是指向Node结构体类型指针


Create_Circle_List(LinkList L,int m)//尾插法建立循环链表
{
        LinkList p,q;
        int i;
        p = L;
        for(i = 0;i<m;i++)
        {
                q = (LinkList)malloc(sizeof(LinkList));
                q ->data = i + 1;
                p ->next = q;
                p =q;
        }
        p->next = L->next;//尾结点指向首结点(首结点不是头结点)

        return OK;               
}

printf_LinkList (LinkList L)
{
        LinkList head,tail;
        head=L->next;

        tail=L->next;
    do
        {
                printf("%d   ",tail->data);
                tail=tail->next;               
        }
        while(head!=tail);
        printf("\n");
}

GetElem(LinkList L, int k,Elemtype *e)
{
        int i=1;
        LinkList q;
        q=L->next;
        while(i<k)
        {
                q=q->next;
                i++;
        }
        *e= q->data;
        return 1;
}

Delete_LinkList(LinkList L, int i,Elemtype *e)
{
        LinkList p,q;
    int j=0;
       
        p=L;

        while(j<i-1 )
        {
                p=p->next;
                ++j;
        }
       
        q=p->next;
        p->next=q->next;
        *e= q->data;               
        free(q);
        printf("\n");
        return 1;               
}

LEN_LinkList(LinkList L)
{
        LinkList head,tail;
        int length=1;

    head=L->next;
        tail=L->next->next;

        while(tail != head)
        {     
                tail = tail->next;
                length++;

        }
        printf("\n");
        return length;
       
}

Insert_LinkList(LinkList L,int i,Elemtype e)
{
        LinkList p,s;
        int j;
        p=L;
        j=1;
        while(j<i)
        {
                p=p->next;
                ++j;

        }
            s=(LinkList)malloc(sizeof(Node));
                s->data=e;
                s->next=p->next;
                p->next=s;


}

Status main()

{

        LinkList L;
        int m,n,k;
                Elemtype *e;
                e=&m;

        L = (LinkList)malloc(sizeof(Node)); //建立头结点
        L ->next = NULL;
               
        printf("请输入创建循环链表长度:");
        scanf("%d",&m);
        Create_Circle_List(L,m);               //创建循环链表
                printf("创建的循环链表为:\n");
        printf_LinkList (L);

                printf("请输入要获取链表元素的位置:");
                scanf("%d",&n);
                GetElem(L, n,e);

                printf("该位置的元素为:%d\n",*e);



                printf("请输入要删除结点的位置:");
                scanf("%d",&k);       
                Delete_LinkList(L, k,e);
                printf("删除的值%d\n",*e);
                printf("新的链表:\n");
                printf_LinkList (L);
                printf("新链表的长度为:%d\n",LEN_LinkList(L));


                printf("请输入要插入结点的位置:\n");
                scanf("%d",&k);
                printf("请输入要插入的值:");
                scanf("%d",&m);
                Insert_LinkList(L,k,m);
                printf("新的链表:\n");
                printf_LinkList (L);
                printf("新链表的长度为:%d\n",LEN_LinkList(L));
        return 0;

}


这是为什么



最佳答案
2017-10-29 07:58:51
最后一个节点指向的是第L->NEXT 这个元素,然后它被free后。

最后一个节点还是指向那个地址的,然后恭喜你“报错”。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2015-1-23 23:19:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-29 07:58:51 | 显示全部楼层    本楼为最佳答案   
最后一个节点指向的是第L->NEXT 这个元素,然后它被free后。

最后一个节点还是指向那个地址的,然后恭喜你“报错”。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 17:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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