静态链表实现(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
轉載于:https://www.cnblogs.com/journal-of-xjx/p/5897654.html
總結
以上是生活随笔為你收集整理的静态链表实现(A-B)+(B-A)【代码】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript动画效果(四)
- 下一篇: IOS笔记 #pragma mark的用