链表查删除以及合并排序和逆序输出

  1 #pragma GCC optimize(3) 
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4 typedef struct stnode
  5 {
  6     int num;//编号 
  7     int score;//数据 
  8     struct stnode *next;//指针域 
  9 }student,*L;
 10 struct stnode *creat(int n)//建立链表 
 11 {    student *head;
 12     head=(student*)malloc(sizeof(student));
 13     if(head==NULL)
 14     {
 15         exit(0);
 16     }
 17     student *end;
 18     end=head;
 19     int i,num,score;
 20     for(i=0;i<n;i++)
 21     {
 22         scanf("%d %d",&num,&score);
 23         student *p;
 24         p=(student *)malloc(sizeof(student));
 25         p->num=num;
 26         p->score=score;
 27         if(head==NULL)
 28         {
 29             head=p;
 30         }
 31         else
 32         end->next=p;
 33         end=p;
 34     }
 35     end->next=NULL;
 36     return head;
 37 }
 38 void connect(L a,L b)//连接链表 
 39 {
 40     while(a->next!=NULL)
 41     {
 42         a=a->next;
 43     }
 44     a->next=b->next;
 45     free(b);
 46 }
 47 void sort(L p1)//链表排序 
 48 {
 49    student *pi,*pj,*index;
 50     for(pi=p1->next;pi!=NULL;pi=pi->next)
 51     {
 52         index=pi;
 53         for(pj=pi->next;pj!=NULL;pj=pj->next)
 54         {
 55             if(index->num>pj->num)
 56             {
 57                 index=pj;
 58             }
 59         }
 60         printf("%d %d\n",index->num,index->score);
 61             index->num=pi->num;
 62             index->score=pi->score;
 63         }
 64 }
 65 void Reverse(L l){//链表反转 
 66     L old_head,new_head,temp;
 67     
 68     old_head=l;
 69     new_head=NULL;
 70     while(old_head)
 71     {
 72         temp=old_head->next;
 73         new_head=old_head;
 74         old_head=temp;
 75     }
 76     l=new_head;
 77 }
 78 void PrintList(L l)//输出函数 
 79 {
 80     L p;
 81     p = l->next;
 82     while (p)
 83     {
 84         cout<<p->num<<' '<<p->score<<endl;
 85         p = p->next;
 86     }
 87 }
 88 L Insert(L l,int x,int i)//尾插函数 
 89 {
 90     L tmp,pre;
 91     
 92     tmp=(L)malloc(sizeof(struct stnode));
 93     tmp->score=x;
 94     if(i==1)
 95     {
 96         tmp->next=l;
 97         return tmp;
 98     }
 99     else
100     {
101         int cnt=1;
102         pre=l;
103         while(pre&&cnt<i-1)
104         {
105             pre=pre->next;
106             cnt++;
107         }
108         if(pre==NULL||cnt!=i-1)
109         {
110             cout<<"插入错误"<<endl;
111             free(tmp);
112             return NULL;
113         }
114         else
115         {
116             tmp->next=pre->next;
117             pre->next=tmp;
118             return l;
119         }
120     }
121 }
122 L Delete(L head,int m)//删除函数 
123 {
124     L prt1,prt2;
125     while(head!=NULL&&(head->score==m))
126     {
127         prt2=head;
128         head=head->next;
129         free(prt2);
130     }
131     if(head==NULL)
132     {
133         return NULL;
134     }
135     prt1=head;
136     prt2=head->next;
137     while(prt2!=NULL)
138     {
139         if(prt2->score==m)
140         {
141             prt1->next=prt2->next;
142             free(prt2);
143         }
144         else
145         prt1=prt2;
146         prt2=prt1->next;
147         
148     }
149         return head;
150 }
151 
152 int main()
153 {
154     ios::sync_with_stdio(false);
155     int n,m;
156     cin>>n>>m;
157     L a=creat(n);//建立链表 
158     L b=creat(m);//建立链表
159     connect(a,b);//链接两个链表 
160     sort(a);//从小到大排个序 
161     Reverse(a);//反转以达到从小到大 
162     PrintList(a);//输出啦 
163     int x,i;
164     cin>>x>>i;//插入的位置以及插入的元素为x 
165     Insert(a,x,i);//插入函数 
166     PrintList(a);//输出函数 
167     int u;
168     cin>>u;
169     Delete(a,u);//删除第u个位置的元素 
170     PrintList(a);
171     return 0;
172 }

 

posted @ 2022-03-16 19:29  江上舟摇  阅读(37)  评论(0编辑  收藏  举报