目录
题目
在一个递增有序的单链表中,存在重复的元素。设计算法删除重复的元素,例如{7,10,10,21,30,42,42,42,51,70}将变为{7,10,21,30,42,51,70}。
核心代码
//删除重复值
void Delete_repeat(LinkList L){
LNode *p=L->next;
LNode *q;
if(p==NULL){
return;
}
while(p->next!=NULL){
q=p->next;
if(p->data==q->data){
p->next=q->next;
free(q);
}else{
//p=q;
p=p->next;
}
}
}
完整代码
//单链表删除重复元素
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode
{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//初始化单链表,建立头结点
bool InitList(LinkList &L){
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
//采用尾插法建立一个单链表
LinkList List_TailInsert(LinkList &L){
int x;
L=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=L;
printf("请输入你想插入的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//删除重复值
void Delete_repeat(LinkList L){
LNode *p=L->next;
LNode *q;
if(p==NULL){
return;
}
while(p->next!=NULL){
q=p->next;
if(p->data==q->data){
p->next=q->next;
free(q);
}else{
//p=q;
p=p->next;
}
}
}
// 输出函数
void print(LinkList L) {
LNode* p = L->next; // 从头节点开始遍历
if (p == NULL) {
printf("链表为空。\n");
} else {
printf("此时单链表中的数据有: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main(){
LinkList L;
InitList(L);
List_TailInsert(L);
print(L);
//删除重复值
Delete_repeat(L);
print(L);
return 0;
}
示例
输入你想插入的第一个值(1—10000):7
想插入的下一个值:10
想插入的下一个值:10
想插入的下一个值:21
想插入的下一个值:30
想插入的下一个值:42
想插入的下一个值:42
想插入的下一个值:42
想插入的下一个值:51
想插入的下一个值:70
想插入的下一个值:9999
此时单链表中的数据有: 7 10 10 21 30 42 42 42 51 70
此时单链表中的数据有: 7 10 21 30 42 51 70