/* 描述:創建一個帶頭結點的單鏈表,在單鏈表中刪除值相同的多余結點,並遍歷鏈表,刪除鏈表最大節點。 輸入:從鍵盤上輸入數據元素個數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 *p=L->next,*s,*q;
while(p!=NULL){
q=p;
while(q->next!=NULL){
if(q->next->data==p->data){
s=q->next;
q->next=s->next;
free(s);
}
q=q->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 is(LinkList *&L){ LinkList *p=L->next->next,*pre,*s; L->next->next=NULL; while(p){ s=p->next; p->next=NULL; pre=L; while(pre->next!=NULL&&pre->next->data<p->data){ pre=pre->next; } p->next=pre->next; pre->next=p; p=s; } }
/* 逆置鏈表 */ void reverseLinkList(LinkList *&L){ LinkList *p=L->next,*s; L->next=NULL; while(p){ s=p->next; p->next=L->next; L->next=p; p=s; } }
/*遍歷輸出鏈表*/ 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; }