【思想】 remove(删除元素=保留不需要删除的元素)。
1.对一个有序数组删除其中重复的元素
【代码】
#include<stdio.h>
int remove(int a[],int Len)
{
int indexa;
int index=0;
for(indexa=0;indexa<Len;indexa++)
{
a[index]=a[indexa];
while(a[index]==a[indexa+1])//不能用if,这里是循环判断是否与后面的相同
indexa++;
index++;
}
return index;
}
void main()
{
int a[]={1,2,3,3,4,4,4,5};
int result;
result=remove(a,8);
printf("the length is %d\n",result);
for(int i=0;i<result;i++)
printf("%d ",a[i]);
printf("\n");
}
2.对一个有序数组删除重复出现超过2次的数,输入{1,1,1,2,2,5},输出{1,1,2,32,5}
【代码】
#include<stdio.h>
int remove(int a[],int Len)
{
int indexa;
int index=1;
for(indexa=1;indexa<Len;indexa++)
{
a[index]=a[indexa];
while(a[index-1]==a[indexa+1])//不能用if,这里是循环判断是否与后面的相同
indexa++;
index++;
}
return index;
}
void main()
{
int a[]={1,1,1,2,2,5};
int result;
result=remove(a,6);
printf("the length is %d\n",result);
for(int i=0;i<result;i++)
printf("%d ",a[i]);
printf("\n");
}
3.对一个有序链表,删除其中重复的结点
设置相邻的两个指针,一个指针用于从头到尾遍历链表,另一个指针是后一个指针用于满足条件时删除结点
【代码】
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node;
//由于肯定不会删除第一个结点,故可以不用头结点。
int remove(Node *head,int n)
{
Node *p,*q;
p=head;
q=head->next;
while(q)
{
while(p->data==q->data)
{
p->next=q->next;
delete(q);
q=p->next;
n--;
}
p=p->next;
q=q->next;
}
return n;
}
void main()
{
Node *head;
Node *node1=(Node *)malloc(sizeof(Node));
Node *node2=(Node *)malloc(sizeof(Node));
Node *node3=(Node *)malloc(sizeof(Node));
Node *node4=(Node *)malloc(sizeof(Node));
Node *node5=(Node *)malloc(sizeof(Node));
node1->data=1;
node2->data=2;
node3->data=2;
node4->data=2;
node5->data=3;
head=node1;
node1->next=node2;
node2->next=node3;
node3->next=node4;
node4->next=node5;
node5->next=NULL;
int n=5;
int result;
int i;
result=remove(head,n);
for(i=0;i<result;i++)
{
printf("%d ",head->data);
head=head->next;
}
printf("\n");
}