zoukankan      html  css  js  c++  java
  • 静态链表实现(A-B)+(B-A)

    -----------------------------------------------第一次发代码,写在前面------------------------------------------------------

    思路不完全等同于严师太的课本,所以代码并不是参照课本。

    代码参照《大话数据结构》相应章节,并经过了相应修改

    注意:链表下标为i的节点和链表中第i个节点在链表初始化后是一样的,但是在经过删除操作后不一样了。

    为此本人在这里浪费了很多时间调试。注意细节。

    代码可有某些地方有瑕疵,但是通过了C::B跑了几组数据,应该没大问题。

    共同学习,共同进步!

    -----------------------------------------------以下摘自《大话数据结构》----------------------------------------------------

    在静态链表中,每一个结点包含两部分内容,一部分是data(即有意义的数据),另一部分是cur(存储该元素下一个元素所在数组对应的下标)。

    有几个特殊的结点:

    首先是下标为0的结点中不包含有意义的数据,它的cur存储的是备用链表(即没有存储的数据的那些结点)第一个结点的下标。如上图2所示,数组第一个元素的cur存放的是7。

    其次是数组最后一个元素,数组最后一个元素的cur存放的是静态链表的第一个结点的下标(此处的第一个结点,是指有实质意义的数据的结点)。

    最后就是链表的最后一个元素(并不一定是数组的最后一个元素),链表最后一个元素的cur一般存放0,表示它后面的结点为空了。

    ---------------------------------------------代码如下---------------------------------------------------------

      1 #include <iostream>
      2 
      3 using namespace std;
      4 
      5 #define MAXSIZE 100
      6 
      7 typedef struct
      8 {
      9 int data;
     10 int cur;
     11 }component,SLinkList[MAXSIZE];
     12 
     13 
     14 int InitSpace_SL(SLinkList& space)
     15 {
     16 for(int i=0;i<MAXSIZE-1;i++) space[i].cur=i+1;
     17 space[MAXSIZE-1].cur=0;
     18 return 0;
     19 }
     20 
     21 
     22 int LocateElem_SL(SLinkList &S,int e)//在静态链表中查找第一个值为e的元素,若找到,则返回它在线性表中的位序,否则返回0;
     23 {
     24 int i=S[MAXSIZE-1].cur;
     25 while(i&&S[i].data!=e)
     26 i=S[i].cur;
     27 if(!i) return 0;
     28 else return i;
     29 }
     30 
     31 
     32 int ListLength_SL(SLinkList& L)
     33 {
     34 int j=0;
     35 int i=L[MAXSIZE-1].cur;
     36 while(i)
     37 {
     38 i=L[i].cur;
     39 j++;
     40 }
     41 return j;
     42 }
     43 
     44 
     45 int Malloc_SL(SLinkList &space)
     46 {
     47 int i=space[0].cur;
     48 if(space[0].cur) space[0].cur=space[i].cur;
     49 return i;
     50 }
     51 
     52 
     53 int Free_SL(SLinkList &space,int k)//把下标为k的空闲节点回收到备用链表,该节点成为备用链表中的首节点
     54 {
     55 space[k].cur=space[0].cur;
     56 space[0].cur=k;
     57 return 0;
     58 }
     59 
     60 int ListInsert_SL(SLinkList &L,int i,int e)//在L中第i个元素之前插入新的元素e
     61 {
     62 int j,k,l;
     63 k=MAXSIZE-1;//k为数组最后一个元素的下标
     64 if(i<1||i>ListLength_SL(L)+1) return 0;
     65 j=Malloc_SL(L);
     66 if(j)//L不为空表
     67 {
     68 L[j].data=e;
     69 for(l=1;l<=i-1;i++)
     70 k=L[k].cur;
     71 L[j].cur=L[k].cur;
     72 L[k].cur=j;
     73 }
     74 return 0;
     75 }
     76 
     77 
     78 int ListInsert2_SL(SLinkList &L,int e)//在备用链表表头插入一个元素
     79 {
     80 int i,j=L[MAXSIZE-1].cur,k=Malloc_SL(L);
     81 for(i=1;i< ListLength_SL(L);i++)
     82 j=L[j].cur;
     83 L[j].cur=k;
     84 L[k].data=e;
     85 L[0].cur=L[k].cur;
     86 L[k].cur=0;
     87 return 0;
     88 }
     89 
     90  
     91 
     92 int ListDelete_SL(SLinkList &L,int i)//删除在L中的第i个元素e
     93 {
     94 int j,k;
     95 if(i<1||i>ListLength_SL(L)) return 0;
     96 k=MAXSIZE-1;
     97 for(j=1;j<=i-1;j++)
     98 k=L[k].cur;
     99 j=L[k].cur;
    100 L[k].cur=L[j].cur;
    101 Free_SL(L,j);
    102 return 0;
    103 }
    104 
    105 
    106 int ListDelete2_SL(SLinkList &L,int i)//删除在L中下标为i的元素L[i]
    107 {
    108 int k=L[MAXSIZE-1].cur,m=L[k].cur;
    109 int j=L[0].cur;
    110 while(m!=i)
    111 {
    112 k=L[k].cur;
    113 m=L[k].cur;
    114 }
    115 L[k].cur=L[m].cur;
    116 L[0].cur=i;
    117 L[i].cur=j;
    118 return 0;
    119 }
    120 int MergeList_SL(SLinkList &L1,SLinkList &L2)//(A-B)+(B-A)
    121 {
    122 int i=L2[MAXSIZE-1].cur;
    123 int m;
    124 while(i)
    125 {
    126 m=0;
    127 int j=L1[MAXSIZE-1].cur;
    128 while(j)
    129 {
    130 m=LocateElem_SL(L1,L2[i].data);
    131 if(m) {ListDelete2_SL(L1,m);break;}
    132 j=L1[j].cur;
    133 }
    134 if(!m) ListInsert2_SL(L1,L2[i].data);
    135 i=L2[i].cur;
    136 }
    137 return 0;
    138 }
    139 
    140 
    141 int main()
    142 {
    143 int m,n,j;
    144 SLinkList L1,L2;
    145 InitSpace_SL(L1);
    146 InitSpace_SL(L2);
    147 cout<<"输入集合A中的元素个数:"<<endl;
    148 cin>>m;
    149 cout<<"输入集合A中各元素的值:"<<endl;
    150 for(int i=1;i<=m;i++)
    151 {
    152 cin>>L1[i].data;
    153 L1[0].cur=L1[i].cur;
    154 }
    155 L1[m].cur=0;
    156 L1[MAXSIZE-1].cur=1;
    157 cout<<"输入集合B中的元素个数:"<<endl;
    158 cin>>n;
    159 cout<<"输入集合B中各元素的值:"<<endl;
    160 for(int i=1;i<=n;i++)
    161 {
    162 cin>>L2[i].data;
    163 L2[0].cur=L2[i].cur;L2[MAXSIZE-1].cur=1;
    164 }
    165 L2[n].cur=0;
    166 L2[MAXSIZE-1].cur=1;
    167 MergeList_SL(L1,L2);
    168 j=L1[MAXSIZE-1].cur;
    169 while(j)
    170 {
    171 cout<<L1[j].data<<" ";
    172 j=L1[j].cur;
    173 }
    174 return 0;
    175 }

    -----XJX

    只有0和1的世界是简单的
  • 相关阅读:
    jQuery属性--html([val|fn])、text([val|fn])和val([val|fn|arr])
    JavaScript--常用的输出方式
    jQuery筛选--hasClass(class)和eq(index|-index)
    jQuery筛选--first()和last()
    EasyUI学习-----表格DataGrid获取数据的方式
    EasyUI学习-----创建DataGrid及冻结列的两种方式
    jQuery属性--addClass()和removeClass()
    jQuery工具--jQuery.isNumeric(value)和jQuery.trim(str)
    jQuery工具--$.each()和$.merge()
    jQuery事件--change([[data],fn])、on(events,[selector],[data],fn)和hover([over,]out)
  • 原文地址:https://www.cnblogs.com/nullxjx/p/5897654.html
Copyright © 2011-2022 走看看