鱼C论坛

 找回密码
 立即注册
查看: 2293|回复: 3

单链表删除重复元素

[复制链接]
发表于 2017-4-22 18:04:46 | 显示全部楼层 |阅读模式

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

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

x
/*
1212121
先拿第一个元素与后面的元素做对比,如果相同就释放相同的元素,如果不相同,就找下一个元素作对比
当对比完所有的元素之后,在拿第二个元素做对比,依次类推。最后输出元素
*/
//# include <stdafx.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef int ElemType;
typedef struct Node
{
        ElemType Elem;
        Node *next;
}Node;

void InitList(Node **pHead) //初始化链表
{
        *pHead = NULL;
        printf("链表初始化完毕\n");
}

Node *CreateList(Node *pHead)//创建链表
{
        Node *p1,*p2; //p1指向头结点,p2指向尾结点
        p1 = p2 = (Node *)malloc(sizeof(Node));//申请结点
        if(p1 == NULL || p2 == NULL)
        {
                printf("链表创建失败\n");
                exit(0);
        }
        memset(p1,0,sizeof(Node)); //改变p1的指向,使P1指向新的内存空间
        scanf("%d",&p1->Elem); //输入元素
        p1->next = NULL;  //新节点的指针置为空
        while(p1->Elem > 0)
        {
                if(pHead == NULL)
                        pHead = p1;
                else p2->next = p1;//如果为空表,则直接接入,否则放到表尾,也就是最后一个元素的后面
                p2 = p1;//把元素变为最后一个元素
                p1 = (Node *)malloc(sizeof(Node));//申请新节点
                if(p1 == NULL || p2 == NULL)
                {
                        printf("内存分配失败\n");
                        exit(0);
                }
                memset(p1,0,sizeof(Node));
                scanf("%d",&p1->Elem);
                p1->next = NULL;
        }
        printf("链表创建成功\n");
        return pHead;
}
void PrintList(Node *pHead)
{
        if(pHead == NULL)
        {
                printf("链表为空\n");
                exit(0);
        }
        while(pHead != NULL)
        {
                printf("%d",pHead->Elem);
                pHead = pHead->next;
        }
        printf("\n");
}
void CompareList(Node *pHead)//删除重复的元素
{
        Node *p2,*pNext;

        while(pHead != NULL)
        {
                p2 = pHead->next;
        while(pHead != NULL)
        {
                if(pHead->Elem == p2->Elem)
                {
                        pNext = p2->next;
                        free(p2);
                        p2 = pNext;
                }
        }
                pHead = pHead->next;
        }
        return;
}
void clearList(Node *pHead)
{
    Node *pNext;            //定义一个与pHead相邻节点

    if(pHead == NULL)
    {
        printf("clearList函数执行,链表为空\n");
        return;
    }
    while(pHead->next != NULL)
    {
        pNext = pHead->next;//保存下一结点的指针
        free(pHead);
        pHead = pNext;      //表头下移
    }
    printf("clearList函数执行,链表已经清除\n");
}
int main()
{
        Node *pList;
        InitList(&pList);
        pList = CreateList(pList);
        PrintList(pList);
        CompareList(pList);
        PrintList(pList);
        clearList(pList);
        return 0;
}


就是判断重复函数那里有问题CompareList,希望能看下到底哪里的问题。出现的问题如图 QQ图片20170422180429.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-22 19:54:59 | 显示全部楼层
这代码通过编译了吗?
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-22 19:57:02 | 显示全部楼层
void CompareList(Node *pHead)//删除重复的元素
{
        Node *p2,*pNext;

        while(pHead != NULL)
        {
                p2 = pHead->next;
        while(pHead != NULL)
        {
                if(pHead->Elem == p2->Elem)
                {
                        pNext = p2->next;
                        free(p2);
                        p2 = pNext;
                }
        }
                pHead = pHead->next;
        }
        return;
}
这段代码中会走入一个死循环,就是pHead != NULL 而且pHead->Elem == p2->Elem不成立时,会一直陷入死循环中,因为你的pHead志向的位置没有变化,然后就是pNext = p2->next;p2 = pHead->next;没有判断 next是否为空指针,这样赋值导致下一次使用p2的时候会报内存错误,就是你那个错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-22 22:22:11 | 显示全部楼层
人造人 发表于 2017-4-22 19:54
这代码通过编译了吗?

vc6.0通过编译
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 05:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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