数据结构-线性顺序表

学渣开始学习数据结构了,所以自己想搞个系列, 慢慢学习,总结自己的错误,理解数据结构的思想以及其代码的推敲,不求吃胖子,只求一步一步。
书本知识来自《大话数据结构》,内容通俗,易于自学吧,代码自己根据此书写的(自己先写代码再去对比书本的代码),雷同很多。思想很重要,在编代码时也发现自己对c语言的陌生,很多错误,慢慢改,慢慢完善。

在写代码时主要犯了线性表的位置与数组下标不同的错误
此外还有指针与引用的错误
ListInsert(*&L1, e, ++Len_L1);

ListInsert(&L1, e, ++Len_L1);
warning: passing argument 1 of 'ListInsert' from incompatible pointer type [enabled by default]|
ListInsert(*L1, e, ++Len_L1);
error: incompatible type for argument 1 of 'ListInsert'|

#include "stdio.h"
#include "stdlib.h"

#define MAXSIZE 20
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct
{
    ElemType data[MAXSIZE];
    int length;
} SqList;

//显示data
Status visit(ElemType e)
{
    printf("%d ", e);
    return OK;
}

//显示数据表数据
Status ListTraverse(SqList L)
{
    int k;
    for(k=0; k<L.length; k++)
    {
        visit(L.data[k]);
    }
    printf("\n");
    return OK;
}

//初始化链表
Status InitList(SqList *L)
{
    L->length = 0;
    return OK;
}

/**
    *链表插入操作
    *i为插入位置,e为插入数据
**/
Status ListInsert(SqList *L, ElemType e, int i)
{
    int k;
    if(L->length == MAXSIZE)//顺序表满
        return ERROR;
    if(i<1 || i>L->length+1)//添加i位置不正确
        return ERROR;
    if(i<=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;
}

/**
    *数据表数据删除操作
    *因没用return返回e值所以使用引用来返回
**/
Status ListDelete(SqList *L, ElemType *e, int i)
{
    int k;
    if(L->length == 0)//数据表为空
        return ERROR;
    if(i<1 || i>L->length)//删除i位置不正确
        return ERROR;
    *e = L->data[i-1];
    if(i<=L->length)
    {
        for(k=i-1; k<L->length; k++)
        {
            L->data[k] = L->data[k+1];
        }
    }
    L->length --;
    return OK;
}

/**
    *通过数据项来查找所在位置
**/
int ListLocate(SqList L, ElemType e)
{
    int i;
    if(L.length == 0)
        return 0;
    for(i=0; i<L.length; i++)
    {
        if(L.data[i] == e)
            return i+1;
    }
    return 0;
}

/**
    *通过位置i获取数据项e
    *因为数组的特性在查找的时间复杂度为O(1)
**/
Status ListGetItem(SqList L, int i, ElemType *e)
{
    if(L.length == 0)
        return ERROR;
    if(i<1 || i>L.length)//查找i的位置不正确
        return ERROR;
    *e = L.data[i-1] ;
    return OK;
}

/**
    *数据表长度
**/
int ListLength(SqList L)
{
    return L.length;
}

/**
    *判断数据表是否为空
**/
Status ListEmpty(SqList L)
{
    if(L.length==0)
        return OK;
    else
        return ERROR;
}

/**
    *初始条件:顺序线性表L已存在。操作结果:将L重置为空表
**/
Status ListClear(SqList *L)
{
    L->length=0;
    return OK;
}

/**
    *将一个线性表合并到另一个线性表
**/
Status ListMerge(SqList *L1, SqList L2)
{
    int i;
    ElemType e;
    int Len_L1 = ListLength(*L1);
    int Len_L2 = ListLength(L2);
    if((Len_L1+Len_L2) > MAXSIZE)
        return ERROR;
    for(i=0; i<L2.length; i++)
    {
        ListGetItem(L2, i+1, &e);
        if(!ListLocate(*L1, e))
            ListInsert(*&L1, e, ++Len_L1);
            //ListInsert(L1, e, ++Len_L1);同上作用
    }
}

int main(void)
{
    SqList L;
    SqList S;
    ElemType e;
    int j;
    InitList(&L);
    for(j=1; j<=5; j++)
    {
        ListInsert(&L, j, j);
    }
    ListTraverse(L);
    printf("插入的数据表为L->data:");
    ListTraverse(L);
    printf("LENGTH = %d\n", L.length);
    ListInsert(&L, 123, 1);
    ListTraverse(L);
//    ListDelete(&L, &e, 5);
//    printf("删除的数据项:%d\n", e);
//    ListTraverse(L);
//    printf("LENGTH = %d\n", L.length);
//    printf("存在数据表%d的位置\n", ListLocate(L, 6));
//    ListGetItem(L, 3, &e);
//    printf("查找到的数据项:%d\n", e);
    InitList(&S);
    for(j=3; j<=13; j++)
        ListInsert(&S, j, j-2);
    printf("插入的数据表为S->data:");
    ListTraverse(S);
    ListMerge(&L,S);
    printf("依次输出合并了Lb的L的元素:");
    ListTraverse(L);
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值