/*
描述:创建一个带头结点的单链表,在单链表中删除值相同的多余结点,并遍历链表,删除链表最大节点。
输入:从键盘上输入数据元素个数n和对应n个元素。
输出:输出删除多余结点的单链表序列。
输入样例:6 3 1 3 4 4 5--7个
输出样例:3 1 4 5
*/
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct Node{
int data;
struct Node *next;
}LinkList;
void create(LinkList *&L,int a[],int n){
int i;
LinkList *s,*r;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;i<n;i++){
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
/*在单链表中删除值相同的多余结点*/
void deleteLinkList(LinkList *&L){
LinkList *pre=L,*p=L->next,*s;
int k=0;
while(p!=NULL){
s=p;
pre=p;
while(pre->next!=NULL){
if(pre->next->data==s->data){
pre->next=pre->next->next;
}
pre=pre->next;
}
p=p->next;
}
}
/*删除链表最大节点*/
bool deleteMax(LinkList *&L){
LinkList *pre=L,*p=L->next,*maxpre=pre,*maxp=p;
while(p!=NULL){
if(p->data>maxp->data){
maxpre=pre;
maxp=p;
}
pre=p;
p=p->next;
}
if(maxpre==NULL||maxp==NULL){return false;}
maxpre->next=maxp->next;
free(maxp);
return true;
}
/*遍历输出链表*/
void print(LinkList *L){
LinkList *p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int n,i;
LinkList *L;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
create(L,a,n);
deleteLinkList(L);
if(deleteMax(L)){
print(L);
}
return 0;
}