实验三

简介: 这个实验三顺序表的实现历经了从前天下午开始在实验室研究标准答案到昨天上午开始写代码并且大概今天才调试成功也是一把鼻涕一把泪的实验3、顺序表的基本操作 (6学时)(1)实验目的通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。

这个实验三顺序表的实现历经了从前天下午开始在实验室研究标准答案到昨天上午开始写代码并且大概今天才调试成功也是一把鼻涕一把泪的

实验3、顺序表的基本操作 (6学时)

(1)实验目的

通过该实验,深入理解顺序表的逻辑结构、物理结构等概念,掌握顺序表基本操作的编程实现,注意顺序表插入、删除等操作过程中数据元素的移动现象,培养学生编写程序时,要考虑程序的强壮性,熟练掌握通过函数参数返回函数结果的办法。

(2)实验内容

编程实现顺序表下教材第二章定义的线性表的基本操作,最好用菜单形式对应各个操作,使其编程一个完整的小软件。

(3)参考界面

(3)验收/测试用例

通过菜单调用各个操作,测试点:

l  没有初始化前进行其他操作,程序是否能控制住;

l  初始化一个顺序表;

l  插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入4个数据(1,2)、(1,1)、(3,3);

l  显示顺序表中的数据,屏幕输出1, 2, 3;

l  判空,屏幕输出顺便表非空;

l  顺便表长度,屏幕输出3;

l  获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;

l  定位,输入:4, 输出:不存在,输入2,输出位置为2;

l  求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;

l  求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;

l  删除,要测位置在【1,3】范围之外的情况和之内的情况;

l  清空操作后再测长度;

l  销毁顺序表

16:22:33  第一次完成代码如下(但是有一个bug就是在32位 电脑上这个万能头文件不能使用)

  1 #include<bits/stdc++.h>
  2 #define LIST_INIT_SIZE  100
  3 #define LISTINCREMENT   10
  4 
  5 typedef int Status; 
  6 typedef int ElemType;    
  7 /*
  8 typedef int status;
  9 是个自定义类型的语句。
 10 typedef用来定义类型的别名。
 11 status i  就相当于   int i;
 12 至于为什么叫status,原因可能为status的英文意思是状态,编程者想用int值表示一个状态,所以自定义一个类型。
 13 这样status i;一看就知道变量i表示一个状态变量。
 14 */
 15 typedef struct{            //给结构体起别名:SqList 
 16     ElemType *elem;        //存储空间基址 
 17     int length;            //当前长度 
 18     int listsize;        //当前分配的存储容量(以sizeof(ElemType)为单位) 
 19 }SqList; 
 20 
 21 Status InitList(SqList &L);
 22 Status DestroyList(SqList &L);
 23 Status ClearList(SqList &L);
 24 Status ListEmpty(SqList &L);
 25 Status ListLength(SqList &L);
 26 Status GetElem(SqList &L,int i,int *e);
 27 Status PriorElem(SqList &L,int e,int *pre_e);
 28 Status NextElem(SqList &L,int cur_e,int *pre_e);
 29 Status ListInsert(SqList &L,int i,int e);
 30 Status ListDelete(SqList &L,int i,int *e);
 31 Status ListTraverse(SqList &L);
 32 int main()
 33 {
 34     printf("1----初始化化一个线性表\n");
 35     printf("2----销毁线性表\n");
 36     printf("3----清空线性表\n");
 37     printf("4----判断线性表是否为空\n");
 38     printf("5----求线性表长度\n");
 39     printf("6----获取线性表指定 位置元素\n");
 40     printf("7----求前驱\n");
 41     printf("8----求后继\n");
 42     printf("9----在线性表指定位置插入元素\n");
 43     printf("10---删除线性表指定位置元素\n");
 44     printf("11---显示线性表\n");
 45     printf("     退出,输入一个负数!\n");
 46     printf("请输入操作代码:\n");
 47     
 48     int n;
 49     int count=0;
 50     int dizhi;
 51     int yuansu;
 52     SqList L;
 53     while(1)
 54     {
 55         printf("请输入功能指令:");
 56         scanf("%d", &n);
 57         if(n<1||n>11)
 58         {
 59             printf("没有此功能\n");
 60             break;
 61         }
 62         if(n==1)
 63             count++;
 64         if(count<1)
 65         {
 66             printf("请先初始化线性表(功能1)");
 67             continue;
 68         }
 69         switch(n)
 70         {
 71             case 1:
 72                 InitList(L);
 73                 break;
 74             case 2:
 75                 DestroyList(L);
 76                 break;
 77             case 3:
 78                 ClearList(L);
 79                 break;
 80             case 4:
 81                 ListEmpty(L);
 82                 break;
 83             case 5:
 84                 ListLength(L);
 85                 break;
 86             case 6:
 87                 
 88                     printf("请输入查找的位置");
 89                     scanf("%d",&dizhi);
 90                     if(GetElem(L, dizhi,  &yuansu))
 91                         printf("第%d个元素为%d",dizhi,yuansu);
 92             //获取元素为什么要再把yuansu给弄成空值??? 
 93                 break;
 94             case 7:
 95                 printf("请输入元素:");
 96                 scanf("%d",&dizhi);
 97                 if(PriorElem(L,dizhi, &yuansu))
 98                 {
 99                     printf("你输入的元素的前驱为:%d\n",yuansu);
100                 }
101                 
102                 break;
103             case 8:
104                 printf("请输入元素:");
105                 scanf("%d",&dizhi);
106                 if(PriorElem(L,dizhi, &yuansu))
107                 {
108                     printf("你输入的元素的后继为:%d\n",yuansu);
109                 }
110             
111                 break;
112             case 9:
113                 printf("请输入插入位置:\n");
114                 scanf("%d", &dizhi);
115                 printf("请输入插入元素: \n");
116                 scanf("%d", &yuansu);
117                 ListInsert(L,dizhi,yuansu);
118                 
119                 break;
120             case 10:
121                 printf("请输入删除位置:");
122                 scanf("%d",&dizhi);
123                 if(ListDelete(L,dizhi,&yuansu))
124                     printf("你删除的数字为%d",yuansu);
125                 
126                 break;
127             case 11:
128                 ListTraverse(L);
129                 break;    
130         }
131         
132     }
133 }
134     
135 //构造一个空的线性表 
136 Status InitList(SqList &L){
137     L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
138     if(!L.elem)    exit(OVERFLOW);        //存储分配失败
139     L.length = 0;                    //空表的长度为0
140     L.listsize = LIST_INIT_SIZE;    //初始存储容量
141     return 1; 
142 }
143 
144 //销毁线性表
145 Status DestroyList(SqList &L){
146     if(L.elem==NULL)
147     {
148         printf("线性表不存在");
149     }
150     free(L.elem);
151     L.elem=NULL;
152     printf("销毁成功\n");
153     
154 } 
155 
156 //清空线性表
157 Status ClearList(SqList &L){
158     if(L.elem==NULL)
159     {
160         printf("线性表不存在");
161     }
162     L.length=0;
163     printf("线性表已清空");
164     
165 } 
166 
167 //判断线性表是否为空
168 Status ListEmpty(SqList &L){
169     if(L.elem==NULL)
170     {
171         printf("线性表为空表");
172     } 
173     else
174         printf("线性表不为空");
175 }
176 
177 //求线性表长度
178 Status ListLength(SqList &L){
179     if(L.elem==NULL)
180     {
181         printf("线性表为空表");
182     } 
183     printf("线性表长度为%d",L.length);
184 } 
185 
186 //获取线性表指定位置插入元素
187 Status GetElem(SqList &L,int i,int *e){
188     if(L.elem==NULL)
189     {
190         printf("线性表为空表");
191         return 0;
192     } 
193     *e=L.elem[i-1];
194     return 1;
195 } 
196 
197 //求前驱 
198 Status PriorElem(SqList &L,int cur_e,int &pre_e){
199     int i=0;
200     while(L.elem[i]!=cur_e&&i<L.length)
201         i++;
202     if(i<L.length)
203     {
204         if(i=0)
205         {
206             printf("首元素没有前驱");
207             return 0;
208         }
209         pre_e=L.elem[i-1];
210         return 1;
211     }else
212         printf("你输入的元素不存在");
213         return 0;
214         
215     
216 }
217 
218 //求后驱
219 Status NextElem(SqList &L,int cur_e,int &pre_e){
220     int i=L.length-1;
221     while(L.elem[i]!=cur_e&&i>=0)
222         i--;
223     if(i>=0)
224     {
225         if(i=L.length-1)
226         {
227             printf("尾元素没有后驱");
228             return 0;
229         }
230         pre_e=L.elem[i+1];
231         return 1;
232     }else
233         printf("你输入的元素不存在");
234         return 0;
235         
236     
237 }
238 
239 //在线性表指定位置插入元素
240 Status ListInsert(SqList &L,int i,int e){
241     int *p,*q,*newbase;
242     if(i<1||i>L.length+1)    return 0;    //i值不合法
243     if(L.length>=L.listsize){
244         newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
245         if(!newbase)    exit(OVERFLOW);        //存储分配失败
246         L.elem = newbase;                    //新基址
247         L.listsize += LISTINCREMENT;        //增加存储容量 
248     } 
249     q = &(L.elem[i-1]);                        //q为插入位置
250     for(p = &(L.elem[L.length-1]);p>=q;--p)    //插入位置及之后的元素右移 
251         *(p+1)=*p; 
252     *q = e;                                    //插入e
253     ++L.length;                                //表长加1
254     return 1; 
255 } 
256 
257 //删除线性表指定位置元素
258 Status ListDelete(SqList &L,int i,int *e){
259 //在顺序线性表L中删除第i个元素,并用e返回其值
260 //i的合法性为 1<=i<=ListLength
261     int pos;
262     if (i<1||i>L.length)
263     {
264         printf("指定的删除位置不合法,应该在1到%d之间!\n",L.length);
265         return 0;
266     }
267     *e=L.elem[i-1];
268     for(pos=i-1;pos<L.length-1;pos++)
269         L.elem[pos]=L.elem[pos+1];
270     L.length--;
271     printf("删除成功!");
272     return 1; 
273 } 
274 
275 //显示线性表
276 Status ListTraverse(SqList &L){
277     if(L.elem==NULL)
278     {
279         printf("线性表为空表");
280         return 0;
281     } 
282     for(int i=0;i<L.length;i++)
283         printf("%d", L.elem[i]);
284     printf("\n");
285     return 1;
286     
287 }
288 
289     

 

目录
相关文章
|
9月前
|
C++
C++程序设计实验4
C++程序设计实验4
75 0
|
9月前
|
机器学习/深度学习 Serverless C++
C++程序设计实验2
C++程序设计实验2
179 0
|
9月前
|
C++
C++程序设计实验6
C++程序设计实验6
62 0
|
9月前
|
C++
C++程序设计实验1
C++程序设计实验1
64 0
|
9月前
|
C++
C++程序设计实验7
C++程序设计实验7
47 0
|
9月前
|
存储 C++
C++程序设计实验3
C++程序设计实验3
73 0
|
缓存 Linux
我做了个实验!
这次我们就以 malloc 动态内存分配为切入点,我在文中也做了小实验: • malloc 是如何分配内存的? • malloc 分配的是物理内存吗? • malloc(1) 会分配多大的内存? • free 释放内存,会归还给操作系统吗? • free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?
我做了个实验!
|
关系型数据库 MySQL 索引
我做了一天的实验!
对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。但是,next-key lock 在一些场景下会退化成记录锁或间隙锁。 那到底是什么场景呢?今天,我们就以下面这个表来进行实验说明。
我做了一天的实验!
|
存储 人工智能 BI
实验2
实验2、集合的交、并、差 (1学时) (1)实验目的 通过该实验,进一步让学生熟练掌握循环结构、循环控制条件、分支结构和数组/链表基本操作的实现,掌握函数参数设定的有关内容,体会到用数组存储集合时,需要记录集合元素的个数,否则输出结果会出现数据越界现象。
930 0