数据结构和算法学习笔记:线性表的顺序实现

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define MaxSize 50

//静态分配
typedef struct
{
    int data[MaxSize];//向内存申请空间的大小
    int length;//实际最后一个元素的位置,其实可以把他定位为数组的pos位置
               //指向数组最后一个有元素的下一个没有元素的位置。
}SqList;//下次就用SqList作为结构体“顺序表”的数据类型的定义时的名称。


//动态分配
#define InitSize 100
typedef struct
{
    int *data;//实际上是一个用指针定义的名为data的数组
    int maxsize,length;//向内存空间申请分配的数组最大容量maxsize和当前数组中元素的个数length
}SeqList;//加个e和SqList区分开,注意这个typedef是一个语句,最后需要加上分号




//线性表顺序实现(顺序表)的插入和删除操作
//插入
/*
实际问题描述:向线性表的第i个位置插入元素elem
过程描述:
向数组的0~(L.length-1)号位置(线性表的1~L.length位置)插入新元素elem
若输入的第i号位置的i不合法,包括两种情况(i<1||i>length+1)和(length>MaxSize),则应返回bool类型标志为false的0,表示插入失败;
若i位置合法,则从后向前一直到i依次往后挪一个位置(搬家),在i位置放入elem,L.length++,范围bool标志true的1,表示插入成功。
//一定要注意我们的实际问题是向线性表中的第i个位置插入元素,而不是数组,所以我们在与用户交互的时候用户输入来的i是线性表中的i
*/
bool seq_list_insert(SeqList *L,int i,int elem)
{
    if(i<1||i>L->length+1) return false;
    if(L->length>=MaxSize)return false;//这个条件必须单独拿出来再判断,不能将i>length和它合并,否则会出问题,比如length==MaxSize时显然不该插入进去

    for(int j=L->length;j>=i;j--) L->data[j]=L->data[j-1];//仔细思考,length代表数组中有元素的位置的下一个元素,当然直接给到j位置的元素就行

    L->data[i-1]=elem;//i是线性表的位置,不只是数组的位置。
    L->length++;
    return true;
}

bool seq_list_dele(SeqList *L,int i,int *elem)
{
    if(i<1||i>L->length)return false;
    *elem=L->data[i-1];//不仅能够通过标志来确定是否删除元素,还能够将这个被删除的元素得到
    for(int j=0;j<L->length;j++) L->data[j-1]=L->data[j];

    L->length--;
    return true;

}

//按值查找,在线性表中查找元素elem,若成功,返回位序,若失败返回0;
//线性表顺序实现只能按值查找?
int locate_elem_in_seq_list(SeqList L,int elem)
{
    int i=0;
    if(L.length==0)return 0;
    for(;i<L.length;i++) if(L.data[i]==elem) return i+1;
    return 0;
    //若成功,返回位序,若失败返回0;
}

//SeqList m;
//m.data=(int *)malloc(InitSize*sizeof(int));//不能在全局区给结构体初始化!!!
//m.length=10;

int main()
{
    SeqList L;//定义一个动态分配的线性表L

    //初学的时候一定要注意,不要养成习惯对一个结构体赋值,我们能够进行赋值的永远只有结构体中的成员
    L.data = (int *)malloc(InitSize*sizeof(int));//对线性表L进行用数组顺序实现对那个数组初始化
                                                //C++中的初始化语句为L.data=new int [InitSize];
                                                //注意复习C++中new运算符是怎么new数组的,是[]而不是圆括号
    int i=0;
    while(i<1||i>L.length+1)
    {
        printf("请输入需要插入到线性表中的元素的位置:");
        scanf("%d",&i);
        if(i>=1&&i<=L.length+1)break;
        printf("输入有误,请重新输入\n");
    }
    printf("请输入需要插入到线性表中的整数:");
    int elem_insert=0;
    scanf("%d",&elem_insert);

    int flag_insert=seq_list_insert(&L,i,elem_insert);
    printf("\n插入的元素为:%d\n",L.data[i-1]);
    int elem_from_dele=0;
    seq_list_dele(&L,i,&elem_from_dele);
    printf("\n删除的元素为:%d\n",elem_from_dele);

    printf("请输入需要在线性表中查找的整数:");
    int elem_in_locate=0;
    scanf("%d",&elem_in_locate);
    int location_of_elem=0;
    if(locate_elem_in_seq_list(L,elem_in_locate)==0)printf("\n没找到\n");
    else
    {
        location_of_elem=locate_elem_in_seq_list(L,elem_in_locate);
        printf("\n找到了,元素在线性表中的位置为:%d\n",location_of_elem);
    }

    return 0;
}

注意点:

1.不能在全局区给结构体初始化

2.对于函数,C语言不能和C++一样在函数定义的时候使用引用&,如seq_list_dele(SeqList &L,int i,int *elem)就不对,必须写成seq_list_dele(SeqList *L,int i,int *elem),也即C语言在这种函数中不能直接使用L.length,而必须写为L->length,要表示元素elem就必须写为(*elem)//意思是说以上不能的C++可以,能得C++也可以

3.C++中new一个数组是int *ptr=new int[个数];

4.一定要始终注意我们实际的问题是针对“线性表”线性表的位置i,i从位置1开始,而我们的数组知识它顺序实现的途径,所以i-1才是数组下标对应的元素才是线性表位置i上的元素,一定要注意实际的需求是什么!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值