线性表的顺序存储结构(含源码)

学习线性表顺序存储之后,在使用C语言具体实现后,发现一些问题,现总结如下:

#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define maxsize 20
typedef int elemtype; 
typedef int status;
//建线性表
typedef struct
{
    elemtype data[maxsize];
    int length;
 } sqlist;

 //初始化线性表
status initlist(sqlist *l)
{
    l->length=0;
    return OK;
 } 

status visit(elemtype c)
{
    printf("%d ",c);
    return OK;
 } 

 //将元素e插入线性表第i个位置
status insertlist(sqlist *l,elemtype e,int i)
{
    /*int k;
    if(l->length==maxsize)
    return ERROR;
    if(i<1||i>l->length+1)
    return ERROR;
    if(k<=l->length)
    {
        for(k=l->length-1;k>=i-1;k--)
        l->data[k+1]=l->data[k];
    }
    l->data[i-1]=e;
    l->length++;
    return OK;*/
    int k;
    if(i<1||i>l->length+1){
        return ERROR;
    } 
    for(k=l->length-1;k>=i-1;k--){
        l->data[k+1]=l->data[k];
    }
    l->data[i-1]=e;
    l->length++;
    return OK;
 } 

 //遍历线性表
status traverselist(sqlist l)
{
    int i;
    for(i=0;i<l.length;i++)
    visit(l.data[i]);
    return OK;
 } 

//线性表长度
status listlength(sqlist *l)
{
    return l->length;
}

//判断l是否为空
status listempty(sqlist *l)
{
    if(l->length==0)
    return TRUE;
    else
    return FALSE;
 } 

//清空线性表
status listclear(sqlist *l)
{
    l->length=0;
    return OK;
 } 

 //用e返回线性表中第i位的元素
 status getelem(sqlist *l,int i)
 {
    elemtype e=l->data[i-1];
    return e; 
  } 

//删除线性表中第i个元素
status deleteelem(sqlist *l,int i)
{
    elemtype e;
    e=l->data[i-1];
    int k;
    if(i<1||i>l->length)
    return ERROR;
    if(i<l->length)
    {
        for(k=i;k<l->length;k++)//注意循环条件 
        l->data[k-1]=l->data[k];
    }
    l->length--;
    return e;
 } 

//判断某元素e是否存在于线性表中
status locatelist(sqlist *l,elemtype e)
{
    for(int k=0;k<l->length;k++)
    {
        if(e==l->data[k])
        break;
    }
    return FALSE;
 } 

//合并两线性表
status unionl(sqlist *la,sqlist *lb)
{
    int lenlb=listlength(lb),lenla=listlength(la);
    elemtype e;
    for(int k=1;k<lenlb;k++)
    {
        e=getelem(lb,k);//从头到尾遍历lb取出每一个元素 
        if(!locatelist(la,e))//如果e不在线表la中 
        insertlist(la,e,lenla++);//则将e插入la,la表长增加一个单位 
    }
 } 
int main(void)
{

    sqlist l,lb;
    int k;
    initlist(&l);
    printf("初始化后,l.length=%d\n",l.length);
    for(k=1;k<=5;k++)
    {
        insertlist(&l,k,1);
    }
    printf("在表头插入1~5后,l.data=");
    traverselist(l);
    putchar('\n');

    k=listlength(&l);
    printf("l.length=%d",l.length);

    k=listempty(&l);
    printf("l是否为空:i=%d(1是 0否)\n",k);

    listclear(&l);
    printf("清空l后,l.length=%d\n",l.length);

    k=listempty(&l);
    printf("l是否为空:i=%d(1是 0否)",k);

    printf("在表头插入1~10后,l.data=");

    for(k=1;k<=10;k++)
    {
        insertlist(&l,k,k);//在表尾插只需让插入位置和插入数值保持相等 
    }
    traverselist(l);
    putchar('\n');

    printf("在表头插入0后,l.data=");
    insertlist(&l,0,1);
    traverselist(l);
    putchar('\n');

    k=getelem(&l,5);
    printf("第五个的值为:%d\n",k);

    for(k=4;k<=5;k++)
    {
        int j=getelem(&l,k);
        printf("第%d个元素的值为%d\n",k,j);
    }

    int len=listlength(&l);
    printf("l.length=%d\n",len);

    status j;
    for(k=12;k>=11;k--)
    {
        j=deleteelem(&l,k);
        if(j==ERROR) 
        printf("删除第%d个元素失败\n",k);
        else
        printf("删除第%d个元素的值为%d\n",k,j); 
    }

    printf("依次输出l的元素:");
    traverselist(l);
    putchar('\n');

    elemtype e=deleteelem(&l,5);
    printf("删除第5个元素的值为%d\n",e);

    printf("依次输出l的元素:");
    traverselist(l);
    putchar('\n');

    printf("依次输出合并了lb和l的元素:");

    for(int k=9;k<=15;k++)
    {
        insertlist(&lb,k,1);
    }
    //traverselist(lb);
    unionl(&l,&lb);
    traverselist(l);

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值