zjc7836 发表于 2015-1-21 23:09:17

删除链表结点 free 该结点报错

#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;

}


这是为什么



a19715 发表于 2015-1-23 23:19:27

不二如是 发表于 2017-10-29 07:58:51

最后一个节点指向的是第L->NEXT 这个元素,然后它被free后。

最后一个节点还是指向那个地址的,然后恭喜你“报错”。。。
页: [1]
查看完整版本: 删除链表结点 free 该结点报错