线性表的实现

作者:小胖吴 | 创建时间: 2023-07-26
本次介绍链表的实现.包括插入,删除,求长度等等...
线性表的实现

操作方法

代码如下:

#include<stdlib.h> #include<iostream.h> #include<malloc.h> #define INITSIZE 2 #define INCREACESIZE 1 //数据抽象出来.目的:改一个全部改 typedef int DataType; struct List{ DataType *data; int length; int allocate_size; }*L; /* 说明:return -1 表示失败 return 1  表示成功 */ //功能: //    1)查看当前表的长度 //    2)查看当前分配的空间 //    3)遍历表 void ditalList(List &L) { cout<<"**********************************************************************\n"; cout<<"\n当前长度:"<<L.length; cout<<"\n当前分配空间:"<<L.allocate_size; cout<<"\n"; if(L.length == 0) cout<<"\n空表或不存在该表\n"; else{ int i; for(i=0;i<L.length;i++) { cout<<"\n表中的第"<<i+1<<"数据为: "<<L.data[i]; } } cout<<"\n此次遍历完成\n"; } //分配内存出错 void err() { cout<<"分配内存失败"; exit(-1); } //初始化链表 void initList(List &L) { //实现: //    1)为链表中的data非配内存 //    2)为表长 和  初始分配空间赋初值 L.data=(DataType *)malloc(INITSIZE*sizeof(DataType)); if(L.data == NULL) err(); L.length=0; L.allocate_size= INITSIZE; } int insertList(List &L,int position,int value) { //前提条件: // 1) 插入位置正却 // 2) 如果表满,则从以INCREACESIZE 为增量增加 //注意:   先判断是否表满,再判断位置是否满足 //解释:   先由长度 与 当前分配空间的大小   来确定是否进行分配. if(L.length >= L.allocate_size) { cout<<"从新非配内存中....\n"; int *newData=(DataType *)realloc(L.data,(INCREACESIZE + L.length)*sizeof(DataType)); if(newData== NULL) { err(); return -1; } L.allocate_size += INCREACESIZE; L.data=newData; } if(position <1 || position > L.allocate_size) { cout<<"插入位置不合法\n"; return -1; } //操作过程: // 1)获得要插入的位置的地址 // 2)从最后一个开始,一直到当前位置,依次后移 // 3)插入 // 4)表长加1 int *p,*q; p=&(L.data[position-1]); for(q=&(L.data[L.length-1]);q>=p;q--) { L.data[position + 1]=L.data[position]; } *p=value; L.length += 1; } //获取表的长度 int lengthList(List &L) { return L.length; } //清空表 void clearList(List &L) { L.length=0; } //表是否满 bool isFull(List &L) { if(L.length>=L.allocate_size) return true; return false; } //查询指定值是否在表中 int searchList(List &L,DataType value) { int i; for(i=0;i<L.length;i++) { if(value == L.data[i]) return i; } return  -1; } //删除指定的元素 bool removeList(List &L,int position,DataType  &value) { //第一个角标为1 //实现: // 1)判断位置是否合理 // 2)value存放要删除的值 // 3)节点前移 // 4)长度减一 // 5)返回状态 if(position <1 || position > L.length) { cout<<"删除位置不合法"; return false; } value=L.data[position - 1]; int i; //如果发现想不出来,画图方能解决此问题 for(i=position;i<=L.length;i++) { L.data[i-1]=L.data[i]; } L.length -=1; } void main() { L=(List *)malloc(sizeof(List)); initList(*L); ditalList(*L); insertList(*L,1,1); insertList(*L,2,2); insertList(*L,3,3); insertList(*L,4,4); insertList(*L,5,5); insertList(*L,6,6); insertList(*L,7,7); ditalList( *L); int value; removeList(*L,5,value); cout<<"删除的元素为:"<<value<<"\n"; ditalList(* L); cout<<"表长为:"<<lengthList(*L)<<"\n"; if(isFull(*L)) cout<<"表满\n"; else cout<<"表未满\n"; cout<<"该元素是表中的第"<<searchList(*L,3)<<"个元素"<<"\n"; }

以上代码已运行并且通过,可以直接复制测试或者改良

点击展开全文

更多推荐