删除链表中重复元素的两种操作
#include<bits/stdc++.h>
using namespace std;
struct LNode
{
int data;
struct LNode *next;
};
void create(LNode *&L,int a[],int n)///尾插法建表
{
LNode *r,*s;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
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;
}
/***删除一个有序链表中重复元素***/
/***例如: 1 1 2 3 4 4 5 5 ***/
/*
void delete_elem(LNode *&L)
{
LNode *p,*q;
p=L->next;
while(p->next!=NULL)
{
if(p->data==p->next->data)
{
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}
}
*/
/***删除无序表中重复元素***/
/**算法思想:
设置两个指针变量p,q;
用q后移找与p相同相同就删除并继续向后找直到遍历到链表尾
第一个重复查找删除完成此时p向后移q=p重复上述过程
例如 1 2 3 2 3 4 5 4 1 2
***/
/*
void delete_element(LNode *&L)
{
LNode *p,*q,*r,*s;
p=L->next;
while(p->next!=NULL)
{
q=p;
while(q->next!=NULL)
{
if(p->data==q->next->data)
{
r=q->next;
q->next=r->next;
free(r);
}
else
q=q->next;
}
p=p->next;
///输出中途过程验证
// s=L;
// while(s->next!=NULL)
// {
// printf("%d ",s->next->data);
// s=s->next;
// }
// printf("\n");
}
}
int main()
{
int n,a[100];
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
LNode *L;
create(L,a,n);
///delete_elem(L);
delete_element(L);
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L=L->next;
}
printf("\n");
return 0;
}
删除链表中的最大值和最小值
/***
6
2 1 6 5 3 4
minn==1
maxm==6
2 5 3 4
***/
#include<bits/stdc++.h>
using namespace std;
#include<bits/stdc++.h>
using namespace std;
struct LNode
{
int data;
struct LNode *next;
};
void create(LNode *&L,int a[],int n)///尾插法建表
{
LNode *r,*s;
L=(LNode*)malloc(sizeof(LNode));
L->next=NULL;
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 deletmin(LNode *&L)
{
LNode *pre,*minn,*p,*minpre;
// pre:p节点的前驱节点,minpre:minn的前驱节点
pre=L;
p=L->next;
minn=p;
int flag=0;//标记第一个节点是否为最小值
while(p!=NULL)
{
if(p->data < minn->data)
{
flag=1;
minn=p;
minpre=pre;
}
pre=p;
p=p->next;
}
printf("minn==%d\n",minn->data);
if(flag==0)
L->next=minn->next;
else
minpre->next=minn->next;
free(minn);
}
void deletmax(LNode *&L)
{
LNode *pre,*p,*maxpre,*maxm;
pre=L;
p=pre->next;
maxm=p;
int flag=0; //标记第一个节点是否为最大值
while(p)
{
if(p->data > maxm->data)
{
flag=1;
maxm=p;
maxpre=pre;
}
pre=p;
p=p->next;
}
printf("maxm==%d\n",maxm->data);
if(flag==0)
L->next=maxm->next;
else
maxpre->next=maxm->next;
free(maxm);
}
int main()
{
int n,a[100];
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
LNode *L;
create(L,a,n);
deletmin(L);
deletmax(L);
while(L->next!=NULL)
{
printf("%d ",L->next->data);
L=L->next;
}
printf("\n");
return 0;
}