单链表删除重复元素
/*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,希望能看下到底哪里的问题。出现的问题如图
这代码通过编译了吗?
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的时候会报内存错误,就是你那个错误 人造人 发表于 2017-4-22 19:54
这代码通过编译了吗?
vc6.0通过编译
页:
[1]