赞
踩
通常,线性表可以采取顺序存储和链式存储两种,今天我们来讨论下顺序存储结构以及其对应的实现算法。
采用顺序存储是表示线性表的最简单的方法,具体做法是:将线性表中的元素一个接一个地存储在一片相邻的存储区域中。这种顺序表示的线性表也称为顺序表。顺序表,它是用元素在计算机中存储的物理位置的相邻关系来表示其元素的逻辑关上的相邻关系。只要确定了首地址,线性表中的任意元素的位置都可以方便的计算出来,达到可以随机存储的效果。
目录
我们可以通过以下方式定义一个顺序表
- #define MAXNUM 100; //顺序表中可以存储元素的最大个数
- int n; //顺序表中当前元素的个数
- DataType *element; //element[0],element[1],...,element[n-1]来存放顺序表中DataType类型数据
但是这种定义它存在一个不足:n和element完全处于独立的地位,没有反映出它们的内在联系。所以程序中完全可以把它们当成独立的自由变量来使用。为了解决这一缺陷,我们可以引进SeqList结构,来将二者产生联系,它的定义为:
- struct SeqList{
- int MAXNUM;
- int n;
- DataType* element;
- };
在实际应用中,为了访问和操作结构体中的元素方便,可以定义一个SeqList类型的指针类型来便于操作。
那好,到这里,要生成一个顺序表其算法要如何实现呢?这里通过代码演示一下如何生成一个简易的顺序表。
- struct SeqList{
- int MAXNUM;
- int n;
- int *element;
- };
- typedef struct SeqList *PSeqList;
- PSeqList create_SeqList(int max,int num)/*创建一个最大容量为max,实际容量为num,用于存放int
- 类型数据的顺序表 */
- {
-
- PSeqList palist=(PSeqList)malloc(sizeof(struct SeqList)) ;
- if(palist==NULL) //存储分配失败
- {
- printf("ERROR!");
- return NULL;
- }
- else{
- palist->element=(int*)malloc(sizeof(int*)*max); //分配存放num个int类型元素的空间
- if(palist->element==NULL)
- {
- printf("Error!");
-
- return NULL;
- }
- else{ //这一部分主要是用来进行存放数据,可以根据实际需要进行存放
- int a=0,N=0;
- palist->MAXNUM=max;
- while(a<num)
- {
- palist->element[a]=a;
- palist->n=N;
- N++;
- a++;
-
- }
- return palist;
- }
- }
- }

- void Print_SeqList(PSeqList palist)//使用成功 遍历顺序表
- {
- int count=0;
- if(palist->n==0) printf("空表。。。"); //进行判断该顺序表是否为空表
- printf("该表长:%d,实际存储数据长度:%d\n",palist->MAXNUM,palist->n);
- for(;count<palist->n;count++)
- {
- printf("序号%d数据是:%d\n",count,palist->element[count]);
- }
- printf("输出完毕!\n");
-
- }
结合一、二我们来测试一下代码运行结果。
一切正常!
顺序表的插入具体操作实现其实很好理解,假定你要在下标为p的元素前插入一个新元素,我们首先要判断该顺序表是否已经装满了元素,即判断palist->n<palist->MAXNUM是否成立,成立及说明顺序表没有满,则可以进行插入操作,否则报异常。然后我们只需将p及其后面的元素,依次往后移动一个位置,然后将新元素插入到原先的p元素的位置,最后更新顺序表实际长度即可。
具体实现代码如下:
- int Test_insertPost_seq(PSeqList palist,int p,int x) //测试成功
- {
-
- if(palist->n>palist->MAXNUM) return -1; //判满
- if(p<0 || p>palist->n-1) return -1 ; //判合理
- int i;
- for(i=palist->n-1;i>=p;i--)
- {
- palist->element[i+1]=palist->element[i]; //移位
- }
- palist->element[p]=x; //插数据
- palist->n=palist->n+1;
- return 1; //延长顺序表
- }
顺序表的删除其实跟顺序表的插入大致相同,顺序表的插入其要求后边的元素整体后移,而顺序表的删除则是要求后面的元素整体往前移动一个位置,最后更新表节点长度即可。
- int Test_deleteV_seq(PSeqList palist,int x)//测试成功
- {
-
- if(palist->n==0) return -1; //判空
- int i,j;
- for(i=0;i<palist->n-1;i++) //寻找数据x的下标
- {
- if(palist->element[i]==x) break;
- }
- for(j=i;j<palist->n-1;j++)
- {
- palist->element[j]=palist->element[j+1]; //移位
- }
- palist->n=palist->n-1; //更新顺序表长
- return 1;
- }

其实这个跟删除一个元素的方法大差不差,说白了就是迭代调用删除一个元素的方法即可。
- int dele_seq_by_index(PSeqList palist ,int i) //删除顺序表中下标为i的元素
- {
- int j;
- for(j=i;j<palist->n-1;j++)
- {
- palist->element[j]=palist->element[j+1];
- }
- palist->n=palist->n-1;
- return 1;
- }
- int Test_num_dele_seq(PSeqList palist ,int i) //从i号元素开始,删除完后边元素
- {
- if(palist->n==0) return -1; //判空
- else if(i<0 || i>palist->n-1) return -1; //判合理
- while(palist->n>i) dele_seq_by_index(palist,i);
-
- }

好了,这以上就是关于顺序表的一些简单的创建和使用了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。