C语⾔-数据结构-可变长顺序表的初始化,插⼊和输出
问题描述:
实现可变长顺序表的建表过程。任务要求:通过顺序表的初始化、插⼊算法,实现顺序表的建表,并依次输出顺序表元素。
【输⼊形式】
第⼀⾏输⼊整数N(1<=N<=100),表⽰创建长度为N的顺序表;
第⼆⾏输⼊N个整数,表⽰顺序表的N个元素,依次放⼊表中;
【输出形式】
依次输出顺序表的全部元素。(以空格分隔)
【样例输⼊】
5
1 2 3 4 5
【样例输出】
1 2 3 4 5
采⽤可变长顺序表,顺序表长度可根据数据存储需要,动态增加存储空间。
实现可变长顺序表要定义:常量INIT_SIZE表⽰顺序表初始化的初始长度;常量INCREM表⽰当存储空间不够,每次增加的单元数;顺序表可以存放任意数据类型的数据,上述定义中,名称ElemType表⽰此处代表基本类型int。
#include <stdio.h>
#include <stdlib.h>
#define INIT_SIZE 5      //初始分配的存储空间长度
#define INCREM 3          //存储空间再分配的增量
#define OK 1
#define ERROR 0
下⾯定义结构体类型
typedef int ElemType;
/*顺序表结构*/
typedef struct Sqlist{
ElemType *slist;
int length;
int listsize;
}Sqlist;
顺序表的初始化:
注意:顺序表结构定义时,并未分配存储空间,因此需要进⾏初始化为顺序表分配存储空间。初始化空间⼤⼩为listsize,和表长length。
顺序表的初始化就是为顺序表分配连续的⼀组存储单元。初始化好的顺序表的初始表长为0。
注意:函数malloc由头⽂件<malloc.h>提供。向系统申请分配存储单元,并不能保证⼀定申请成功,因此初始化有可能因未申请到空间⽽导致失败(符号OK表⽰常量1,ERROR表⽰常量0)。
int initSq(Sqlist *L)
{
L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->slist)return 0;    //初始化失败返回0
L->length=0;              //置为空表长度为0
L->listsize=INIT_SIZE;    //设置初始空间容量
return 1;
}
接下来是插⼊和输出操作:
顺序表的插⼊算法:
在顺序表的某个位置插⼊⼀个元素,顺序表中元素的前后逻辑关系会发⽣变化,例如在顺序表第i个位置处插⼊⼀个新元素。
基本步骤:
(1)先移动元素,需要从线性表最后⼀个元素开始向后移动;
(2)插⼊新元素;
(3)修改表长加⼀;(容易忘记)
/
*在i位置插⼊元素:插⼊成功返回1,不成功返回0*/
int insertSq(Sqlist *L, int i,ElemType e)
{
if(i<0||i>L->length+1)return 0;    //插⼊位置不正确返回0
if(L->length+1>L->listsize)        //当前储存空间已满,进⾏空间增量
{
L->slist=(ElemType*)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));        if(!L->slist)return 0;        //申请存储空间失败
L->listsize+=INCREM;
}
int j;
for(j=L->length;j>i;j--)    //插⼊位置后数据元素依次后移
{
L->slist[j]=L->slist[j-1];
}
L->slist[i]=e;    //插⼊新数据元素
L->length++;      //当前表长加⼀
return 1;
}
/*输出顺序表元素*/
void printSq(Sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d ",L->slist[i]);    //依次输出表中元素
}
printf("\n");
}
最后实现完整代码查看结果
#include <stdio.h>
#include <stdlib.h>
#define INIT_SIZE 5      //初始分配的存储空间长度
#define INCREM 3          //存储空间再分配的增量
c语言listinsert函数
#define OK 1
#define ERROR 0
typedef int ElemType;
/*顺序表结构*/
typedef struct Sqlist{
ElemType *slist;
int length;
int listsize;
}Sqlist;
int initSq(Sqlist *L)
{
L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));
if(!L->slist)return 0;    //初始化失败返回0
L->length=0;              //置为空表长度为0
L->listsize=INIT_SIZE;    //设置初始空间容量
return 1;
}
/*在i位置插⼊元素:插⼊成功返回1,不成功返回0*/
int insertSq(Sqlist *L, int i,ElemType e)
{
if(i<0||i>L->length+1)return 0;    //插⼊位置不正确返回0
if(L->length+1>L->listsize)        //当前储存空间已满,进⾏空间增量
{
L->slist=(ElemType*)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType));        if(!L->slist)return 0;        //申请存储空间失败
L->listsize+=INCREM;
}
}
int j;
for(j=L->length;j>i;j--)    //插⼊位置后数据元素依次后移    {
L->slist[j]=L->slist[j-1];
}
L->slist[i]=e;    //插⼊新数据元素
L->length++;      //当前表长加⼀
return 1;
}
/*输出顺序表元素*/
void printSq(Sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
{
printf("%d ",L->slist[i]);    //依次输出表中元素
}
printf("\n");
}
int main()
{
Sqlist sq;
ElemType e;
int n;
if(initSq(&sq)){
scanf("%d",&n);
/*补充代码,实现n个元素顺序表的创建*/
int i;
for(i=0;i<n;i++)
{
scanf("%d",&e);
insertSq(&sq,i,e);
}
printSq(&sq);
}
return 0;
}
运⾏结果如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。