首页 > 编程知识 正文

顺序表的基本操作,顺序表的基本操作代码

时间:2023-05-04 17:04:56 阅读:190390 作者:3730

主题网络与信息安全-数据结构工作1-数据结构基本概念6-1

https://fancyking.ml/archives/71

原题说明6-1顺序表基本操作(10分) )。

在本问题中,要求实现顺序表要素的追加、删除、检索以及顺序表输出这4个基本操作函数。 l是序列图,表示函数statuslistinsert_sq(sqlistl,int pos, ElemType e )在顺序表的pos的位置插入要素e ) pos应该从1开始),函数statuslistdelete_sq )删除顺序表的pos位置的要素,参照型参数函数intlistlocate_sq ) sqlistl,elemtype )检查并返回顺序表中查询元素e的顺序)如果要返回从1开始的顺序来实现,必须考虑表的扩展。

函数接口定义

statuslistinsert_sq(sqlistL,int pos,ElemType e );

statuslistdelete_sq(sqlistL,int pos,ElemType e );

intlistlocate_sq(SQListL,ElemType e );

voidlistprint_sq(sqlistL;

这里,l是顺序表。 pos是位置; e表示元素。 如果插入和删除操作期间的pos参数不正确,函数返回ERROR,否则返回OK。

审判程序示例://库函数头文件包含# include stdio.h # include malloc.h # include stdlib.h//函数状态代码定义# define true1# define define list _ init _ size 100 # definelistincrement 10 typedefintelemtype; //线形表中的元素均为整数型typedef struct{ ElemType* elem; //存储空间基地址int length; //表中元素的个数int listsize; //表容量大小}SqList; //statuslistinsert_sq(sqlistL,int pos,elemtype )由顺序表类型定义的statuslistdelete_sq(sqlistL,int pos,elemtype ); intlistlocate_sq(SQListL,ElemType e ); voidlistprint_sq(sqlistL; //结构初始化和销毁操作statusinitlist_sq(sqlistL )//初始化l为空的有序列表L.elem=(elemtype* ) malloc ) list_init_size*sizeof L.elem ) exit(overflow ); L.listsize=LIST_INIT_SIZE; L.length=0; 返回确定; (}int main ) ) { SqList L; if(initlist_sq ) l!=ok(printf ) initlist_sq:初始化失败! n '; 返回- 1; }for(intI=1; i=10; I ) listinsert_sq(L,I,I ); 输入操作编号; //操作次数scanf('%d”,operationNumber ); while (操作编号!=0) { int operationType; //操作类型scanf('%d”,操作类型); if (操作类型==1) (//操作int pos,elem; scanf('%d%d )、pos和elem ); listinsert_sq(L,pos,elem ); }elseif(operationtype==2) ) /删除操作int pos; ElemType elem; sc

anf("%d", &pos); ListDelete_Sq(L, pos, elem); printf("%dn", elem); } else if(operationType == 3) { //查找定位操作 ElemType elem; scanf("%d", &elem); int pos = ListLocate_Sq(L, elem); if(pos >= 1 && pos <= L.length) printf("%dn", pos); else printf("NOT FIND!n"); } else if(operationType == 4) { //输出操作 ListPrint_Sq(L); } operationNumber--; } return 0;}/* 请在这里填写答案 */

输入格式: 第一行输入一个整数operationNumber,表示操作数,接下来operationNumber行,每行表示一个操作信息(含“操作种类编号 操作内容”)。 编号为1表示插入操作,后面两个参数表示插入的位置和插入的元素值 编号为2表示删除操作,后面一个参数表示删除的位置 编号为3表示查找操作,后面一个参数表示查找的值 编号为4表示顺序表输出操作 输出格式: 对于操作2,输出删除的元素的值 对于操作3,输出该元素的位置,如果不存在该元素,输出“NOT FOUND”; 对于操作4,顺序输出整个顺序表的元素,两个元素之间用空格隔开,最后一个元素后面没有空格。

输入样例: 41 1 112 23 34 输出样例: 1311 2 3 4 5 6 7 8 9 10 笔记部分

一、 realoc 函数

realloc 函数的使用要求引入头文件 stdlib.h

该函数的原型为realloc(void *__ptr, size_t __size)

void* __cdecl realloc( _Pre_maybenull_ _Post_invalid_ void* _Block, _In_ _CRT_GUARDOVERFLOW size_t _Size ); 也就是传入的第一个参数是指针类型,第二个参数是更改后的大小。
如果操作使得内存分配减少,那么函数仅仅是改变了索引信息;如果操作使得内存分配增加,那么当当前内存之后有足够的内存来扩展的时候,函数直接扩展内存,返回指针;当当前内存段之后没有足够的空闲内存时,函数寻找堆 中的第一个能满足申请内存大小的内存段,将数据复制,并且释放旧的内存,返回指针。申请失败返回NULL返回的是指针,但无论何种情况,实际上都不保证返回原指针(可以通过输出地址尝试),原指针会被函数自动的释放,不可二次释放原指针 AC 代码 void ListPrint_Sq(SqList L){ ElemType maxn = L.length; for (ElemType i = 0; i < maxn; ++i){ if(i){ printf(" "); } printf("%d", L.elem[i]); } puts(""); return;}int ListLocate_Sq(SqList L, ElemType e){ ElemType maxn = L.length; for (ElemType i = 0; i < maxn; ++i){ if(L.elem[i] == e){ return i + 1; } } return FALSE;}Status ListDelete_Sq(SqList &L, int pos, ElemType &e){ ElemType maxn = L.length; if(pos < 1 || pos > maxn){ return ERROR; } e = L.elem[pos - 1]; for (ElemType i = pos - 1; i < maxn - 1; ++i){ L.elem[i] = L.elem[i + 1]; } L.length -= 1; // printf("DEL %dn", L.length); // ListPrint_Sq(L); return OK;}Status ListInsert_Sq(SqList &L, int pos, ElemType e){ ElemType maxn = L.length; if(pos < 1 || pos > maxn + 1){ return ERROR; } if(L.length >= L.listsize){ ElemType *newe; newe = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)); if(!newe){ return OVERFLOW; } else { L.elem = newe; L.listsize += LISTINCREMENT; } } for (ElemType i = maxn; i >= pos; --i){ L.elem[i] = L.elem[i - 1]; } L.elem[pos - 1] = e; L.length += 1; // ListPrint_Sq(L); return OK;}/*11 1 2 3 4 5 6 7 8 9 1011 2 3 4 5 6 7 8 9 10*/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。