元素链表数据结构:静态链表
转载
工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下元素链表
首先我们让数组的元素都是由两个数据域成组,data和cur。也就是说,数组的每个标下都对应一个data和一个cur。
数据域data用来寄存数据元素,也就是平日我们要理处的数据;而游标cur相当于单链表中的next针指,
寄存该元素的后继在数组中的标下。我们把这类用数组描述的链表叫做态静链表。
数组的第一个元素,即标下为0的元素的cur就寄存用备链表的第一个结点的标下;而数组的最后一个元素的cur
则寄存第一个有数值的元素的标下,相当于单链表的头节点作用,当个整链表为空时,则为0,示表无指向。
每日一道理
当浮华给予我们过多欺骗,现实中的虚假几乎让我们忘却了真的存在,是真情唤回了迷离的心,是真情带给了我们最纯、最真的感觉,它流露的是美的誓言,渗透的是永恒执著的真爱。
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| |
#include<iostream> using namespace std;
#define MAXSIZE 100
typedef int ElemType; /* 线性表的态静链表存储结构 */ typedef struct Node { ElemType data; int cur; //为0时示表无指向 } StaticLinkList[MAXSIZE];
/* 将一维数组array中各分量链成一个用备链表,array[0].cur为头针指,"0"示表空针指 */ bool InitList(StaticLinkList array) { cout << "InitList..." << endl; for ( int i = 0; i < MAXSIZE - 1; i++) { array[i].cur = i + 1; }
array[MAXSIZE - 1].cur = 0; /* 前目态静链表为空,最后一个元素的cur为0 */
return true; } /* 若用备空间链表非空,则返回配分的结点标下,否则返回0 */ int Malloc_SLL(StaticLinkList array) { int k = array[ 0].cur; if (k) array[ 0].cur = array[k].cur; /* 下一个分量用来做用备 */
return k; } /* 将标下为pos的闲暇结点回收到用备链表 */ void Free_SLL(StaticLinkList array, int pos) { array[pos].cur = array[ 0].cur; /* 把第一个元素的cur值赋给要删除的分量cur */ array[ 0].cur = pos; /* 把要删除的分量标下赋值给第一个元素的cur */ }
int ListLength(StaticLinkList array) { int i = array[MAXSIZE - 1].cur; int j = 0; while(i) { i = array[i].cur; ++j; } return j; } /* 在array中第pos个元素之前入插新的数据元素Elem */ bool ListInsert(StaticLinkList array, int pos, ElemType Elem) { cout << "Insert List from pos: " << pos << " Item " << Elem << endl; if (pos < 1 || pos > ListLength(array) + 1) return false;
int k = MAXSIZE - 1; int i = Malloc_SLL(array); /* 取得闲暇分量的标下 */
if (i) { array[i].data = Elem;
for ( int l = 1; l <= pos - 1; l++) k = array[k].cur;
array[i].cur = array[k].cur; /* 把第pos个元素之前的cur赋值给新元素的cur */ array[k].cur = i; /* 把新元素的标下赋值给第pos个元素之前元素的cur */ return true; }
return false; } /* 删除在array中第pos个数据元素 */ bool ListDelete(StaticLinkList array, int pos) { cout << "Delete List from pos: " << pos << endl; if (pos < 1 || pos > ListLength(array)) return false;
int k = MAXSIZE - 1;
for ( int l = 1; l <= pos - 1; l++) k = array[k].cur;
int j = array[k].cur; array[k].cur = array[pos].cur;
Free_SLL(array, j);
return true; }
bool ListTraverse(StaticLinkList array) { cout << "List Traverse : " << endl; int k = MAXSIZE - 1; while (array[k].cur != 0) { k = array[k].cur; cout << array[k].data << ' '; }
cout << endl; return true; }
int main( void) { StaticLinkList SSL; InitList(SSL); for ( int i = 1; i < 5; i++) ListInsert(SSL, i, i); ListTraverse(SSL);
ListDelete(SSL, 3); ListTraverse(SSL); cout << "List Length : " << ListLength(SSL) << endl;
return 0; }
|
出输为:
态静链表在入插和删除操纵时不须要动移元素,只须要改修游标,从而改进了在顺序存储结构中入插和删除操纵须要动移
量大元素的点缺;但并没有决解连续配分存储带来的表长难以确定的题问;并且失去了顺序存储结构随机存取的性特。
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。