数据结构之线性表

 基础合并:

  1. void MergeList(List La,List Lb,List &Lc)
  2. {
  3.     InitList(Lc);
  4.     i=j=1;k=0;
  5.     La_len=ListLength(La);
  6.     Lb_len=ListLength(Lb);
  7.     while((i<=La_len)&&(j<=Lb_len))
  8.     {
  9.         GetElem(La,i,ai);
  10.         GetElem(Lb,i,bi);
  11.         if(ai<=bi)
  12.         {
  13.             ListInsert(Lc,++k,ai);
  14.             i++;
  15.         }
  16.         else
  17.         {
  18.             ListInsert(Lc,++k,bi);
  19.             j++;
  20.         }
  21.     }
  22.     while(i<=La_len)
  23.     {
  24.         GetElem(La,i++,ai);
  25.         ListInsert(Lc,++k,ai);
  26.     }
  27.     while(j<=Lb_len)
  28.     {
  29.         GetElem(Lb,j++,bj);
  30.         ListInsert(Lc,++k,bj);
  31.     }
  32. }

顺序合并:

  1. #define List_INIT_SIZE=100
  2. #define LISTINCREMENT 10
  3. typedef struct
  4. {
  5.     ElemType *elem;
  6.     int length;
  7.     int listsize;
  8. }SqList;
  9. void MergeList_Sq(SqList La,SqList Lb,SqList &Lc)
  10. {
  11.     pa=La.elem;
  12.     pb=Lb.elem;
  13.     Lc.listsize=Lc.length=La.length+Lb.length;
  14.     pc=Lc.elem=(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
  15.     if(!Lc.elem)exit(OVERFLOW);
  16.     pa_last=La.elem+La.length-1;
  17.     pb_last=Lb.elem+Lb.length-1;
  18.     
  19.     while(pa<=pa_last&&pb<=pb_last)
  20.     {
  21.         if(*pa<=*pb)*pc++=*pa++;
  22.         else *pc++=*pb++;
  23.     }
  24.     while(pa<=pa_last)*pc++=*pa++;
  25.     while(pb<=pb_last)*pc++=*pb++;
  26. }

链表合并:

  1. typedef struct LNode
  2. {
  3.     ElemType data;
  4.     struct LNode *next;
  5. }LNode,*LinkList;
  6. void Merge_L(LinkList &La,LinkList &Lb,LinkList &Lc)
  7. {
  8.     pa=La->next;pb=Lb->next;
  9.     Lc=pc=La;
  10.     while(pa&&pb)
  11.     {
  12.         if(pa->data<=pb->data)
  13.         {
  14.             pc->next=pa;
  15.             pc=pa;
  16.             pa=pa->next;
  17.         }
  18.         else
  19.         {
  20.             pc->next=pb;
  21.             pc=pb;
  22.             pb=pb->next;
  23.         }
  24.     }
  25.     pc->next=pa?pa:pb;
  26.     free(Lb);
  27. }

顺序插入:

  1. #define List_INIT_SIZE=100
  2. #define LISTINCREMENT 10
  3. typedef struct
  4. {
  5.     ElemType *elem;
  6.     int length;
  7.     int listsize;
  8. }SqList;
  9. void ListInsert_Sq(SqList &L,int i,ElemType e)
  10. {
  11.     if(i<1||i>L.length+1)return ERROR;
  12.     if(L.length>L.listsize)
  13.     {
  14.         newbase=(ElemType*)realloc(l.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
  15.         if(!newbase)exit(OVERFLOW);
  16.         L.elem=newbase;
  17.         L.listsize+=LISTINCREMENT;
  18.     }
  19.     q=&(L.elem[i-1]);
  20.     for(p=&(l.elem[L.length-1]);p>q;--p)
  21.         *(p+1)=*p;
  22.     *q=e;
  23.     ++L.length;
  24. }

链表插入:

  1. typedef struct LNode
  2. {
  3.     ElemType data;
  4.     struct LNode *next;
  5. }LNode,*LinkList;
  6. void ListInsert_L(LinkList &L,int i,int e)
  7. {
  8.     p=L;j=0;
  9.     while(p&&j<i-1)
  10.     {
  11.         p=p->next;
  12.         j++;
  13.     }
  14.     if(!p||j>i-1)
  15.         return ERROR;
  16.     s=(LinkList)malloc(sizeof(LNode));
  17.     s->data=e;
  18.     s->next=p->next;
  19.     p->next=s;
  20. }

顺序删除:

  1. #define List_INIT_SIZE=100
  2. #define LISTINCREMENT 10
  3. typedef struct
  4. {
  5.     ElemType *elem;
  6.     int length;
  7.     int listsize;
  8. }SqList;
  9. int ListDelete_Sq(Sqlist &L,int i,ElemType &e)
  10. {
  11.     if((i<1)||(i>L.length))return ERROR;
  12.     p=&(L.elem[i-1]);
  13.     e=*p;
  14.     q=L.elem+L.length-1;
  15.     for(++p;p<q;++p)
  16.         *(p-1)=*p;
  17.     --L.length;
  18.     return OK;
  19. }

链表删除:

  1. typedef struct LNode
  2. {
  3.     ElemType data;
  4.     struct LNode *next;
  5. }LNode,*LinkList;
  6. void ListDelete_L(LinkList &L,int i;ElemType &e)
  7. {
  8.     p=L;j=0;
  9.     while(p->next&&j<i-1)
  10.     {
  11.         p=p->next;
  12.         j++;
  13.     }
  14.     if(!(p->next)||j>i-1)return ERROR;
  15.     q=p->next;
  16.     p->next=q->next;
  17.     e=q->data;
  18.     free(q);
  19.     return OK;
  20. }

求A∪B的总体代码:

  1. void union(List &La,List Lb)
  2. {
  3.     La_len=Listlength(La);
  4.     Lb_len=Listlength(Lb);
  5.     for ( i=1;i<=Lb.len;i++);
  6.     {
  7.         GetElem(Lb,i,e);  //获得线性表Lb中i的元素e,并返回;
  8.         if(!Location(La,e,equal))  //如果不相等,则插入;
  9.             ListInsert(La,++La_len,e);
  10.     }
  11. }

对线性表的初始化:

  1. #define List_INIT_SIZE=100 
  2. #define LISTINCREMENT 10 
  3. typedef struct 
  4.     ElemType *elem; 
  5.     int length; 
  6.     int listsize; 
  7. }SqList; 
  8. void InitList_Sq(SqList &La)
  9. {
  10.     La.elem=(ElemType*)malloc(LIST_INTI_SIZE*sizeof(ElemType));
  11.     if(!La.elem)exit(OVERFLOW);
  12.     La.length=0;
  13.     L.listsize=LIST_INTI_SIZE;    //初始化存储容量
  14. }

查找位序:

  1. int LocateElemd_Sq(SqList L.ElemType e,int (*compare)(ElemType,ElemType))
  2. {
  3.     i=1;
  4.     p=L.elem;
  5.     while(i<L.length&&!(*compare)(*p++,e))++i;// 如果e不满足函数compare,则继续向后移动
  6.     if(i<L.length)return i;
  7.     else return 0;
  8. }

链表中获得第i个位序的值:

  1. void GetElem_L(LinkList L,int i,int &e)
  2. {
  3.     p=L->next;j=1;
  4.     while(p&&j<i)
  5.     {
  6.         p=p->next;
  7.         ++j;
  8.     }
  9.     if(!p||j>i)return ERROR;
  10.     e=p->data;
  11. }

逆向建立单链表:

  1. void create_list(ListLink &L,int n)
  2. {
  3.     //逆序位输入n个值,建立带头结点的单链表L
  4.     L=(LinkLink)malloc(sizeof(LNode));
  5.     L->next=NULL;
  6.     for(i=n;i>0;--i)
  7.     {
  8.         p=(LinkList)malloc(sizeof(LNode));
  9.         scanf(&p->data);
  10.         p->next=L->next;
  11.         L->next=p:
  12.     }
  13. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值