【数据结构】线性表的顺序存储结构——顺序表的代码实现

最近在学习数据结构这门课程,空闲时写一些文章来巩固知识以便更好地理解,如有不对请多多指正包涵,谢谢~~
线性表的顺序存储结构就是把线性表中的所有元素按其逻辑顺序依次存储到计算机中的一块指定的空间中。 线性表的顺序存储结构简称为顺序表

 C语言中用数组存放线性表,数组的基本类型就是线性表中元素的基本类型,数组大小要大于等于线性表的长度!

顺序表的示意图

   下标位置

       线性表存储空间

存储地址
                0                   a1           

LOC(A)

                1                   a2LOC(A)+sizeof(ElemType)
              .........
               i-1aiLOC(A)+(i-1)*sizeof(ElemType)
...   ......
n-1anLOC(A)+(n-1)*sizeof(ElemType)
.........

 MaxSize-1

...LOC(A)+(MaxSize-1)*sizeof(ElemType)

现线性表的功能及C语言代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#define Maxsize 50  //定义数组上界最大为50
typedef char ElemType; 

 //将ElemType代替char型数据类型,也可将char换成int,struct等其他数据类型 
typedef struct
{
    ElemType data[Maxsize];  //存放线性表中的元素
    int length; //存放线性表的长度
}Sqlist;  

void Create(Sqlist *&L,ElemType a[],int n) //由a中的n个元素建立顺序表
{
    int i=0,k=0;
    L=(Sqlist *)malloc(sizeof(Sqlist));  //分配存放线性表的空间
    while(i<n){
        L->data[k]=a[i];                //将元素a[i]存放到线性表中
        k++;
        i++;
    }
    L->length=k;                     //设置线性表的长度为数组的长度
}

void InitList(Sqlist *L)             //初始化线性表
{
    L=(Sqlist *)malloc(sizeof(Sqlist));
    L->length=0;                       //令初始长度为0
}

void DestroyList(Sqlist *&L)     //销毁线性表
{
    free(L);                    
}

int Listlength(Sqlist *L)               //求出线性表的长度
{
    return(L->length);

}

bool ListEmpty(Sqlist *L)          //判断该线性表是否为空表
{
    return(L->length==0);
}


void Print(Sqlist *L)              //输出该线性表
{
    for(int i=0;i<L->length;i++){
        printf("%c ",L->data[i]);
    }
    printf("/n");
}

char Get(Sqlist *L,int i)  //找线性表中第i个数据元素值
{
    if(i<1 || i>L->length){
        return 0;
    }
    else{
    return(L->data[i-1]) ;   //返回第i个数据元素值
    }
}

int Locate(Sqlist *L,ElemType e)   //按元素值查找
{
    int i=0;
    while(i<L->length && L->data[i]!=e)
    {
        i++;
    }
    if(i>=L->length){               
        return 0;
    }
    else{
        return i+1;                        //返回该元素值的物理序号
    }
}
bool Insert(Sqlist *&L,int i,ElemType e)     //在第i个位置插入元素e
{
    int j;
    if(i<1 || i>L->length+1 || L->length==Maxsize){   
        return false;                              //参数i错误时返回false
    }
    i--;                                                  //将顺序表逻辑序号转化为物理序号
    for(j=L->length;j>i;j--){       
        L->data[j]=L->data[j-1];              //将data[i]及后面的元素往后移一个位置
    }
    L->data[i]=e;                                   //插入元素e
    L->length++;
    return true;
}
bool Delete(Sqlist *&L,int i)      //删除位置i处的元素 
{
    int j;
    if(i<1 || i>L->length){
        return false;                                  //参数i错误时返回false
    }
    i--;                                                    //将顺序表逻辑序号转化为物理序号
    int temp;
    temp=L->data[i];                              
    for(j=i;j<L->length-1;j++){                 
        L->data[j]=L->data[j+1];              // 将data[i]之后的元素往前移一个位置
    }
    L->length--;                                     //将长度减1 
    return true;
}

char a[Maxsize];                   //定义一个数组a存放需要输入的数据元素
Sqlist *L;                               //定义一个结构指针      
int n;
int main()
{
	printf("请输入需要输入的数:");
	scanf("%d",&n);
	getchar();
	for(int i=0;i<n;i++){
		scanf("%c",&a[i]);
		getchar();
	}
    Create(L,a,n);
	InitList(L);
	printf("输出线性表:\n");Print(L);
	printf("\n输出线性表长度:\n");printf("%d",Listlength(L));
	ListEmpty(L)?(printf("\n该线性表为空\n")):(printf("\n该线性表不为空\n")); 
	printf("\n输出线性表第3个元素:\n");printf("%c",Get(L,3));
	printf("\n输出元素a的位置:\n");printf("%d",Locate(L,'a'));
	printf("\n在第4个位置上插入f:\n");Insert(L,4,'f');Print(L);
	printf("\n删除第3个元素\n");Delete(L,3);Print(L);
	DestroyList(L); 
	ListEmpty(L)?(printf("\n销毁失败!\n")):(printf("\n已成功销毁该线性表!\n"));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上到来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值