一、实验目的
巩固线性表的数据结构的存储方法和相关操作,学会针对具体应用,使用线性表的相关知识来解决具体问题。
二、实验内容
建立一个由n个学生成绩的顺序表,
n
的大小
由自己确
定,
每一个学生的成绩信息由自己确定,
实现数据的对表进行插入、删除、查找等操作,分别输出结果。
三 、实验步骤
1、依据实验内容分别说明实验程序中用到的数据类型的定义;
2、相关操作的算法表达;
3、完整程序;4、总结、运行结果和分析。
5、总体收获和不足,疑问等。
四、实验算法(参考书本第43~45页)
1、定义(1)静态链表的存储结构定义const int MaxSize=100;struct sNode{int data;int next;}sList[MaxSize];//存放数据的元组
(2)类sList的定义class List{public:List();//构造函数,含空静态链表List(int a[],int n);//构造函数,建立含n个元素的静态链表~List(){} //析构函数void PrintList();//遍历操作函数,按序号依次输出各元素int Delete(int i);//删除操作函数int Get(int i);//按位查找查找函数int Locate(int x);//按值查找操作函数void Insert(int i,int x);//插入操作函数private:int avail;//指向空链指针int first;//指向静态链表头指针};2、遍历函数PrintList算法void List::PrintList(){int p;//定义工作指针p=sList[first].next;while(p!=-1){cout<<sList[p].data<<" ";p=sList[p].next;}}
3、按位查找函数算法int List::Get(int i){if(i<=MaxSize && i>0){return sList[i].data;}else{throw"查找不到数据的位置!";return 0;}}
4、按值查找函数算法int List::Locate(int x){int count;//定义累加器countcount=sList[first].next;for(count;count!=-1;count++){if(sList[count].data==x)return count+1;}return 0;}
5、插入函数算法void List::Insert(int i,int x){int s;s=avail;//利用空闲链的第一个结点avail=sList[avail].next; //空闲链的头指针后移sList[s].data=x; //将x填入下标为s的结点int p=0;for(p;p<MaxSize-1;p++){if(p==i){sList[s].next=sList[p].next;//将下标为s的结点插入到下标为p的结点后面sList[p].next=s;}}}6、删除函数算法int List::Delete(int i){if(i<=MaxSize && i>0){int q;i=i-1;q=sList[i].next;//暂存被删结点的下标sList[i].next=sList[q].next;//摘链sList[q].next=avail;//将节点q插在空闲连的最前端avail=q;//将节点q插在空闲连的最前端return sList[q].data;}else{throw"删除操作位置出错";return 0;}}
7、构造函数
(1)构造一个空链表List::List(){first=0;//初始化头指针avail=0;//初始化空闲链指针sList[0].next=-1;//头结点无后续结点for(int i=0;i<MaxSize;i++)sList[i].next=i+1;//初始化空闲链sList[MaxSize-1].next=-1;//置空闲链结束标志}
(2)有参构造函数List::List(int a[],int n){int s;if(n>MaxSize || n<=0)throw "错误";first=0;//初始化静态链表的头指针sList[0].next=avail=1;//初始化空闲链的头指针for(int i=0;i<MaxSize-1;i++)sList[i].next=i+1;//将数组置为空链sList[MaxSize-1].next=-1;//置空闲链结束标志for(int i=0;i<n;i++){s=avail;sList[s].data=a[i];avail=sList[avail].next;}sList[s].next=-1;}
8、主函数void main(){int r[5]={99,88,77,66,55};List L(r,5);cout<<"执行插入操作前的数据为:"<<"\n"<<endl;L.PrintList();cout<<" ";try{L.Insert(2,44);}catch(char * s){cout<<s<<endl;}cout<<"\n"<<endl;cout<<"执行插入操作后的数据为"<<"\n"<<endl;L.PrintList();cout<<'\n'<<endl;cout<<"值为66的元素位置为:";cout<<L.Locate(66)<<endl;cout<<"\n";cout<<"执行删除操作前数据为:"<<"\n"<<endl;L.PrintList();try{L.Delete(1);}catch(char * s){cout<<s<<endl;}cout<<'\n'<<endl;cout<<"执行删除操作后数据为:"<<"\n"<<endl;L.PrintList();cout<<"\n"<<endl;}
五、实验代码
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 |
|
六、实验运行结果
七、实验总结和心得
1、静态链表虽然是用数组来存储线性表的元素,但在插入和删除操作时,只需要修改游标,不需要移动表中的元素,从而改进了在线性表的中插入和删除操作需要移动大量元素的缺点。
2、静态链表进行插入操作时,不用申请新结点,只需要利用空闲链的第一个结点。
3、静态链表中运用了默认的析构函数,减少了操作。
4、对数组和链表之间的关系有了进一步的了解,两者的有机结合可以让算法更加简单,但是静态链表没有解决连续存储分配带来的表长难以确定的问题。