标题:删除链表中结点相同的结点,相同结点保留一个
只看楼主
莹色暮雨
Rank: 1
来 自:四川眉山
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-11-15
结帖率:100%
已结贴  问题点数:3 回复次数:6 
删除链表中结点相同的结点,相同结点保留一个
#define OK  1
#define ERROR 2
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;
#include"stdio.h"
#include"stdlib.h"
Status InitList(LinkList *M)//初始化,给头指针分配空间,并将头指针的指针域置为NULL(头指针也相当于一个结点,只是没有数据域)
{
    LinkList p;
    p=(LinkList)malloc(sizeof(LNode));
    if(p==NULL)
        return ERROR;
    p->next=NULL;
    *M=p;
    return OK;
}


void GreateList(LinkList *M)//给链表赋值
{
    LinkList p,q;
    int i,n;
    printf("输入链表的结点个数:");
    scanf("%d",&n);
    p=*M;
    if(p!=NULL)
    {
        for(i=n;i>0;i--)
        {
            q=(LinkList)malloc(sizeof(LNode));
            printf("输入第%d个数:",i);
            scanf("%d",&q->data);
            q->next=p->next;
            p->next=q;
        }
    }
}



void OutputList(LinkList M)//输出链表
{
    LinkList p;
    p=M->next;//p指向第一个结点;(*p).data=p->data,都是指向第一个结点的数据域的
    if(M!=NULL)
    {
        while(p!=NULL)
        {
            printf("%d ",p->data);
            p=p->next;
        }
    }
    printf("\n");
}
void Delet(LinkList M)
{
    LinkList p,q,t,r;
    for(p=M->next;p->next!=NULL;p=p->next)
    {
        for(q=p->next,t=p;q!=NULL;)
        {
            if(p->data!=q->data)
            {
                t=q;
                q=q->next;
            }
            else
            {
                r=q->next;
                free(q);
                t->next=r;
                q=r;
            }
        }
    }
}
void main()
{
    LinkList L;
    InitList(&L);
    GreateList(&L);
    OutputList(L);
    Delet(L);
    OutputList(L);
}//为什么当第一个和第二个是一样的时候就会出错啊?还有第一跟第三同第二跟第四同的时候也出错?请帮忙看下?谢谢,谢谢,不知道哪错老????
搜索更多相关主题的帖子: next include return 
2012-11-15 21:56
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:3 
程序代码:
   for(p=M->next;p->next!=NULL;p=p->next)
     {
         for(q=p->next,t=p;q!=NULL;)
         {
             if(p->data!=q->data)
             {
                 t=q;
                 q=q->next;
             }
             else
             {
                 r=q->next;
                 free(q);
                 t->next=r;
                 q=r;
             }
         }
     }

第一层for循环发生了  段错误  (非法内存访问)
2012-11-15 23:42
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
for (p=M->next;p->next!=NULL;p=p->next)

好好读读这个循环   先是执行第三部分  p = p->next  然后再是第二部分 p->next != NULL      
如果在运行地三部分的时候  p->next  就为NULL   这样此次执行下去 就有问题了

2012-11-15 23:50
莹色暮雨
Rank: 1
来 自:四川眉山
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-11-15
得分:0 
回复 3楼 寒风中的细雨
好的,谢谢哈。。。。。
2012-11-17 15:41
莹色暮雨
Rank: 1
来 自:四川眉山
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-11-15
得分:0 
回复 3楼 寒风中的细雨
但是如果地散步p->next为NULL;那么在第二步判断p->next的时候就是NULL;那么第三部根本无法执行啊。。。。
2012-11-17 15:50
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 5楼 莹色暮雨
多说无益   自己单步执行体会下  错误的产生
2012-11-17 16:36
莹色暮雨
Rank: 1
来 自:四川眉山
等 级:新手上路
帖 子:16
专家分:0
注 册:2012-11-15
得分:0 
ok ok!!!!
2012-11-17 17:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-387202-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.180784 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved