方法一:最为普遍的方法一个一个删除
方法二:批量删除,一次将所有重复元素全部删除
方法三:将原表分成表1和表2,取表2的数据和表1的对比相同的舍弃,不同的直接加入到表1中。
代码如下:
#include <algorithm>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
int num[10];
int sum = 0;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
Status InitList_LinkList(LinkList *L)
{
*L = (LNode *)malloc(sizeof(LNode));
if (!L)
exit(ERROR);
(*L)->next = NULL;
return OK;
}
Status ListLength_LinkList(LinkList L)
{
int length = 0;
while(L->next)
{
L = L->next;
length++;
}
return length;
}
Status GetElem_LinkList(LinkList L, ElemType *e, ElemType i)
{
LinkList p=L->next;
int j=1;
while(p&&j<i)
{
p = p->next;
j++;
}
if (!p || j > 1)
return ERROR;
*e = p->data;
return OK;
}
Status EqualList_LinkList(ElemType e1,ElemType e2)
{
if (e1 == e2)
return 1;
else
return 0;
}
Status ListInsert_LikList(LinkList *L,ElemType e,ElemType i)
{
LinkList p=*L, s;
int j=0;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if (!p || j > i-1)
return ERROR;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next= s;
return OK;
}
void Randomize(int *array, int n, int min, int max)
{
int i = 0;
srand(time(NULL));
for (i = 0; i < n; ++i) {
array[i] = rand() % (max - min + 1) + min;
}
}
Status CreatList_LinkList(LinkList *L1,LinkList *L2,LinkList *L3)
{
Randomize(&num[0], 10, 1, 10);
std::sort(num, num + 10);
for(int i=0;i<10;i++)
{
ListInsert_LikList(L1, num[i], i + 1);
ListInsert_LikList(L2, num[i], i + 1);
ListInsert_LikList(L3, num[i], i + 1);
}
return OK;
}
Status Destroy_LinkList(LinkList *L)
{
LinkList p, q;
p = *L;
q = p->next;
while(p)
{
free(p);
p = q;
q = q->next;
}
return OK;
}
void printlist_LinkList(LinkList L)
{
LinkList p;
p = L;
printf("此表数据为:\n");
while(p->next)
{
p=p->next;
printf("%4d", p->data);
}
printf("\n");
}
Status ListRepeatDelete1_LinkList(LinkList *L)
{
LinkList p,q,r;
p = (*L)->next;
if (!p) exit(ERROR);
sum = 0;
while (p)
{
q = p;
while (q->next)
{
sum++;
if (q->next->data == p->data)
{
r = q->next;
q->next = r->next;
free(r);
}
else q = q->next;
}
p = p->next;
}
printf("\n方法一执行了%d次\n", sum);
return OK;
}
Status ListRepeatDelete2_LinkList(LinkList *L)
{
LinkList p, q;
p = (*L)->next;
if (!p) exit(ERROR);
sum = 0;
while(p)
{
q = p->next;
while(q)
{
sum++;
if(q->next==NULL&& q->data == p->data)
{
p->next = NULL;
break;
}
if(q->data==p->data)
{
q = q->next;
}
else
{
if (p->next != q)
{
p->next = q;
}
break;
}
}
p = p->next;
}
printf("\n方法二执行了%d次\n", sum);
return OK;
}
Status ListRepeatDelete3_LinkList(LinkList *L)
{
LinkList p, q;
p = (*L)->next;
if (!p) exit(ERROR);
sum = 0;
q = p->next;
p->next = NULL;
int flag;
while(q)
{
flag = 1;
LinkList r= (*L)->next;
while(r)
{
sum++;
if(q->data==r->data)
{
flag = 0;
q = q->next;
break;
}
r = r->next;
}
if(flag==1)
{
sum++;
p->next = q;
p = p->next;
q = q->next;
p->next = NULL;
}
}
printf("\n方法二执行了%d次\n", sum);
return OK;
}
int main()
{
LinkList List1,List2,List3;
InitList_LinkList(&List1);
InitList_LinkList(&List2);
InitList_LinkList(&List3);
CreatList_LinkList(&List1,&List2,&List3);
printlist_LinkList(List1);
ListRepeatDelete1_LinkList(&List1);
printf("删除重复元素后");
printlist_LinkList(List1);
ListRepeatDelete2_LinkList(&List2);
printf("删除重复元素后");
printlist_LinkList(List2);
ListRepeatDelete3_LinkList(&List3);
printf("删除重复元素后");
printlist_LinkList(List3);
}
看到觉得好的大佬给我点个赞赞
本文介绍了一种使用C++实现的链表去重算法,通过三种不同方法去除链表中的重复元素,包括逐一删除、批量删除以及通过对比两个链表数据进行去重。文章提供了详细的代码实现,并通过实例展示了每种方法的执行过程和效果。
515

被折叠的 条评论
为什么被折叠?



