算法思想:因为他是有序表,所以相邻结点如果有相同得一定是挨着得,所以用p扫描链表,如果p的后继与他相等,就删除后继
还有一种解法,采用尾插法,将头结点摘下,从第一个结点开始,后面的要插入的结点依次和链表中的最后一个进行比较,如果相等就删除当前然后向后遍历处理下一个结点,不相等就插入,直到最后一个为止
下面给出代码
#include<stdio.h>
#include <bits/stdc++.h>
typedef struct lnode{
int data;//数据
struct lnode *next;//指针域
}lnode,*LinkList;
int a[10]={7,10,10,21,30,42,42,42,51,70};
int n=10;
void InitList(LinkList &L){//尾插法初始化链表
L=(LinkList)malloc(sizeof(lnode));
lnode *s,*r=L;
for(int i=0;i<n;i++){
s=(lnode*)malloc(sizeof(lnode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void Print(LinkList L){
lnode *s=L->next;
while(s){
printf("%d ",s->data);
s=s->next;
}
printf("\n");
}
void DeleteCom(LinkList &L){
lnode *p,*q;
p=L->next;
// 首先判断链表是否为空
if(L->next==NULL){
return;
}
// while(p->next!=NULL){
// if(p->data==p->next->data){
// p->next=p->next->next;//这里 不用怕断链,因为是在原表上面操作
// }else{
// p=p->next;
// }
// }
//这里给出一种引用其他指针得操作
while(p->next!=NULL){
//先声明一个q指针指向p->next,让他和p->data进行比较
q=p->next;
if(p->data==q->data){
p->next=q->next;
free(q);
} else{
p=p->next;
}}
}
int main(){
lnode *L;
InitList(L);
Print(L);
printf("_________________\n");
DeleteCom(L);
Print(L);
return 0;
}
第二种解法有兴趣的小伙伴可以试试,这里就不在给出代码了,今天的题有点easy