单链表

  1. #include<iostream>
  2. #include<malloc.h>
  3. #include<stdlib.h>
  4. using namespace std;
  5. #define OK 1
  6. #define ERROR 0
  7. typedef int Status;
  8. typedef int ElemType; 
  9. typedef Status(*compare)(ElemType,ElemType);
  10. typedef struct LNode{
  11.         ElemType data;
  12.         struct LNode *next;
  13.         }LNode,*LinkList;
  14.         
  15. void CreateList_L(LinkList &L,int n)               //创建链表 
  16. {
  17.      L=(LinkList)malloc(sizeof(LNode));
  18. L->next=NULL;
  19.      LinkList p,q;
  20.      for(int i=0;i<n;i++)
  21.      {
  22.         p=(LinkList)malloc(sizeof(LNode));
  23.         cin>>p->data;
  24.         p->next=NULL;
  25.         if(!i) {L->next=p;q=p;}
  26.         else {q->next=p;q=p;}
  27.              }
  28. }
  29. /*
  30. Status GetElem_L(LinkList L,int i,ElemType &e)   //若第i个元素存在则返回该值 
  31. {
  32.        LinkList p=L;
  33.        int j=0;
  34.        while(j<i&&p->next)
  35.        {
  36.          p=p->next;
  37.          j++; }
  38.        if(!p||j>i) return ERROR;
  39.        e=p->data;
  40.        return OK;
  41.        }
  42.                                                                  */
  43. Status ListInsert_L(LinkList &L,int i,ElemType e)         //插入 
  44. {
  45.        int j=1;
  46.        LinkList p=L;
  47.        while(j<i&&p->next)
  48.        {
  49.          p=p->next;
  50.          j++;
  51.        }
  52.        if(!p||j>i) return ERROR;
  53.        LinkList q=(LinkList)malloc(sizeof(LNode));
  54.        q->data=e;
  55.        q->next=p->next;
  56.        p->next=q;
  57.        return OK;
  58.        }
  59. Status ListDelete_L(LinkList &L,int i,ElemType &e)        //删除 
  60. {
  61.        int j=1;
  62.        LinkList p=L;
  63.        while(j<i&&p->next)
  64.        {
  65.          p=p->next;
  66.          j++;
  67.        }
  68.         if(!p||j>i) return ERROR;
  69.        e=p->next->data;
  70.        p->next=p->next->next;
  71.        return OK;}
  72.        
  73. void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)       
  74. {
  75. //已知单链线性表La和Lb的元素按值非递减排列。
  76. // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
  77. LinkList pa=La->next,pb=Lb->next,pc=Lc=La;
  78. while(pa&&pb)
  79. {
  80.      if(pa->data<=pb->data) {pc->next=pa;pc=pa;pa=pa->next;}
  81.      else {pc->next=pb;pc=pb;pb=pb->next;}
  82.                }
  83. pc->next=pa?pa:pb;
  84. free(Lb);
  85. }
  86. void ListSort_L(LinkList &L,int n)                //排序 
  87. {
  88.    LinkList p;
  89.    int j;
  90.    for(int i=n-1;i>0;i--)
  91.    for(j=0,p=L->next;j<i;j++)
  92.    {if(p->data>p->next->data) {ElemType t=p->data;
  93.                              p->data=p->next->data;
  94.                              p->next->data=t;}
  95.    p=p->next;
  96.    }
  97. }
  98. void Output(LinkList L)              //输出 
  99. {
  100.      while(L=L->next)
  101.      cout<<L->data<<" ";
  102.      cout<<endl;}
  103. int LocateElem_L(LinkList L,ElemType e,          
  104.               Status(*compare)(ElemType a,ElemType b))
  105. {    //返回顺序表中第一个和e满足compare的元素位置 
  106.      LinkList p=L->next;
  107.      int i=0;
  108.      while(p&&!((*compare)(p->data,e))) {i++;p=p->next; }
  109.      if(!p) return 0;
  110.      else return i+1;}
  111. Status Equal(ElemType a,ElemType b)             //判断是否相等 
  112. {
  113.        if(a==b) return true;
  114.        else return false;}
  115. compare com=Equal;
  116. void minus(LinkList &La,LinkList &Lb) //La-Lb
  117. {
  118.      LinkList pb=Lb->next;
  119.      ElemType e;
  120.      while(pb)
  121.     {int j=LocateElem_L(La,pb->data,*com);
  122.     if(j) ListDelete_L(La,j,e);
  123.     pb=pb->next; }
  124. }
  125. int main()
  126. {
  127. void minus(LinkList &La,LinkList &Lb);
  128. LinkList La,Lb,Lc;
  129. int num,num_a,num_b,pos_in,pos_del;
  130. ElemType insert_elem,delete_elem;
  131. cin>>num_a;
  132. CreateList_L(La,num_a);
  133. ListSort_L(La,num_a);
  134. Output(La);
  135. cin>>num_b;
  136. CreateList_L(Lb,num_b);
  137. ListSort_L(Lb,num_b);
  138. Output(Lb);
  139. minus(La,Lb);
  140. Output(La);
  141. MergeList_L(La,Lb,Lc);
  142. Output(Lc);
  143. cout<<"please input the position and the element you want to insert:";
  144. cin>>pos_in>>insert_elem;
  145. if(ListInsert_L(Lc,pos_in,insert_elem)) cout<<"insert succeed"<<endl;
  146. Output(Lc);
  147. cout<<"please input the position you want to delete:";
  148. cin>>pos_del;
  149. ListDelete_L(Lc,pos_del,delete_elem);
  150. Output(Lc);
  151. return 0;}
  152. 输入输出:
  153. 4
  154. 3 4 2 1
  155. 1 2 3 4
  156. 5
  157. 5 2 1 6 7
  158. 1 2 5 6 7
  159. 3 4
  160. 1 2 3 4 5 6 7
  161. please input the position and the element you want to insert:3 8
  162. insert succeed
  163. 1 2 8 3 4 5 6 7
  164. please input the position you want to delete:5
  165. 1 2 8 3 5 6 7
  166. 请按任意键继续. . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值