- #include<iostream>
- #include<malloc.h>
- #include<stdlib.h>
- using namespace std;
- #define OK 1
- #define ERROR 0
- typedef int Status;
- typedef int ElemType;
- typedef Status(*compare)(ElemType,ElemType);
- typedef struct LNode{
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
- void CreateList_L(LinkList &L,int n) //创建链表
- {
- L=(LinkList)malloc(sizeof(LNode));
- L->next=NULL;
- LinkList p,q;
- for(int i=0;i<n;i++)
- {
- p=(LinkList)malloc(sizeof(LNode));
- cin>>p->data;
- p->next=NULL;
- if(!i) {L->next=p;q=p;}
- else {q->next=p;q=p;}
- }
- }
- /*
- Status GetElem_L(LinkList L,int i,ElemType &e) //若第i个元素存在则返回该值
- {
- LinkList p=L;
- int j=0;
- while(j<i&&p->next)
- {
- p=p->next;
- j++; }
- if(!p||j>i) return ERROR;
- e=p->data;
- return OK;
- }
- */
- Status ListInsert_L(LinkList &L,int i,ElemType e) //插入
- {
- int j=1;
- LinkList p=L;
- while(j<i&&p->next)
- {
- p=p->next;
- j++;
- }
- if(!p||j>i) return ERROR;
- LinkList q=(LinkList)malloc(sizeof(LNode));
- q->data=e;
- q->next=p->next;
- p->next=q;
- return OK;
- }
- Status ListDelete_L(LinkList &L,int i,ElemType &e) //删除
- {
- int j=1;
- LinkList p=L;
- while(j<i&&p->next)
- {
- p=p->next;
- j++;
- }
- if(!p||j>i) return ERROR;
- e=p->next->data;
- p->next=p->next->next;
- return OK;}
- void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
- {
- //已知单链线性表La和Lb的元素按值非递减排列。
- // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
- LinkList pa=La->next,pb=Lb->next,pc=Lc=La;
- while(pa&&pb)
- {
- if(pa->data<=pb->data) {pc->next=pa;pc=pa;pa=pa->next;}
- else {pc->next=pb;pc=pb;pb=pb->next;}
- }
- pc->next=pa?pa:pb;
- free(Lb);
- }
- void ListSort_L(LinkList &L,int n) //排序
- {
- LinkList p;
- int j;
- for(int i=n-1;i>0;i--)
- for(j=0,p=L->next;j<i;j++)
- {if(p->data>p->next->data) {ElemType t=p->data;
- p->data=p->next->data;
- p->next->data=t;}
- p=p->next;
- }
- }
- void Output(LinkList L) //输出
- {
- while(L=L->next)
- cout<<L->data<<" ";
- cout<<endl;}
- int LocateElem_L(LinkList L,ElemType e,
- Status(*compare)(ElemType a,ElemType b))
- { //返回顺序表中第一个和e满足compare的元素位置
- LinkList p=L->next;
- int i=0;
- while(p&&!((*compare)(p->data,e))) {i++;p=p->next; }
- if(!p) return 0;
- else return i+1;}
- Status Equal(ElemType a,ElemType b) //判断是否相等
- {
- if(a==b) return true;
- else return false;}
- compare com=Equal;
- void minus(LinkList &La,LinkList &Lb) //La-Lb
- {
- LinkList pb=Lb->next;
- ElemType e;
- while(pb)
- {int j=LocateElem_L(La,pb->data,*com);
- if(j) ListDelete_L(La,j,e);
- pb=pb->next; }
- }
- int main()
- {
- void minus(LinkList &La,LinkList &Lb);
- LinkList La,Lb,Lc;
- int num,num_a,num_b,pos_in,pos_del;
- ElemType insert_elem,delete_elem;
- cin>>num_a;
- CreateList_L(La,num_a);
- ListSort_L(La,num_a);
- Output(La);
- cin>>num_b;
- CreateList_L(Lb,num_b);
- ListSort_L(Lb,num_b);
- Output(Lb);
- minus(La,Lb);
- Output(La);
- MergeList_L(La,Lb,Lc);
- Output(Lc);
- cout<<"please input the position and the element you want to insert:";
- cin>>pos_in>>insert_elem;
- if(ListInsert_L(Lc,pos_in,insert_elem)) cout<<"insert succeed"<<endl;
- Output(Lc);
- cout<<"please input the position you want to delete:";
- cin>>pos_del;
- ListDelete_L(Lc,pos_del,delete_elem);
- Output(Lc);
- return 0;}
- 输入输出:
- 4
- 3 4 2 1
- 1 2 3 4
- 5
- 5 2 1 6 7
- 1 2 5 6 7
- 3 4
- 1 2 3 4 5 6 7
- please input the position and the element you want to insert:3 8
- insert succeed
- 1 2 8 3 4 5 6 7
- please input the position you want to delete:5
- 1 2 8 3 5 6 7
- 请按任意键继续. . .
单链表
最新推荐文章于 2024-10-06 12:03:03 发布