数据结构与算法-线性表-顺序表

线性表(List):由类型相同的元素(Element)组成的有序的序列。表中的元素和它的位置可以有联系,也可以没有关联。
按照元素的值与其位置是否有联系可以划分为有序线性表和无序线性表。
例如:字母表:{A,B,C…,X,Y,Z}
每个月的天数:{31,28,31,30,31}
线性表有两种基本实现方法:顺序表(array-based list )和链表(linked list)。

#include<stdio.h>
#include<stdlib.h>
#define true 1
#define false 0
//实现一个基础数组的功能,数组的定位,取元素,插入,删除
typedef int Elem;
typedef struct List{
	Elem *list; //保存线性表的元素
	int max_size; //线性表最大保存元素个数
    int cur_pos;  //当前位置
    int list_length; //数组已经保存元素的个数
	
}List;
#define MAX_LIST_SIZE 10000
bool list_create(List *array,int len)
{
    if(len>MAX_LIST_SIZE)
        return false;
    array->list=(Elem*)malloc(sizeof(Elem)*len);
    if(array->list==NULL)
        return false;
    array->max_size=len;
    array->cur_pos=-1;
    array->list_length=0;
    return 0;
}
bool list_clear(List *array)
{
    if(array->list!=NULL)
    {
        free(array->list);
        array->list=NULL;
    }
    array->cur_pos=-1;
    array->list_length=0;
    array->max_size=0;
    return true;
}
int list_get_length(List *array)
{
    return array->list_length;
}
bool list_get_val(List *array,Elem *val)
{
    if(array->list_length==0||array->list==NULL)
        return false;
    if(array->cur_pos<0||array->cur_pos>=(array->list_length))
        return false;
    *val=array->list[array->cur_pos];
    return true;
}
bool list_print(List *array)
{
    if(array->list==NULL)
        return false;
    for(int i=0;i<array->cur_pos;i++)
    {
        printf("%d\t",array->list[i]);
    }
    printf("*");
    for(int i=array->cur_pos;i<array->list_length;i++)
    {
        printf("%d\t",array->list[i]);
    }
    printf("*******************************************\n");
    return true;
}
bool list_insert(List *array,const Elem val)
{
    if(array->list_length>=array->max_size)
        return false;
    if(array->cur_pos<0||array->cur_pos>=array->list_length)
        return false;
    if(array->list_length>0)
        for(int i=array->list_length;i>array->cur_pos;i--)
            array->list[i]=array->list[i-1];
    if(array->cur_pos==-1)
        array->cur_pos=0;
    array->list[array->cur_pos]=val;
    array->list_length++;
    return true;
}
bool list_append(List *array,const Elem val)
{
    if(array->list_length>=array->max_size)
        return false;
    array->list[array->list_length]=val;
    array->cur_pos=array->list_length;
    array->list_length++;
    return true;
}
bool list_remove(List *array,Elem *val)
{
    if(array->cur_pos<0||array->cur_pos>=array->list_length)
        return false;
    for(int i=array->cur_pos;i<array->list_length-1;i++)
        array->list[i]=array->list[i+1];
    array->list_length--;
    return true;
}
bool list_alert(List *array,const Elem val)
{
    if(array->cur_pos<0||array->cur_pos>=array->list_length)
        return false;
    array->list[array->cur_pos]=val;
    return true;
}


bool list_set_start(List *array)
{
    if(array->list_length==0)
        return false;
    array->cur_pos=0;
    return true;
}

bool list_set_end(List *array)
{
    if(array->list_length==0)
        return false;
    array->cur_pos=array->list_length-1;
    return true;
}
bool list_next(List *array)
{
    if(array->list_length==0||array->cur_pos==array->list_length-1)
        return false;
    array->cur_pos++;
    return true;
}
bool list_pre(List *array)
{
    if(array->list_length==0||array->cur_pos==0)
        return false;
    array->cur_pos--;
    return true;
}
bool list_set_pos(List *array,int pos)
{
    if(array->list_length==0||pos<0||pos>=array->list_length)
        return false;
    array->cur_pos=pos;
    return true;
}

int main()
{
    List list_e;
    Elem elem;
    list_create(&list_e,100);
    //list_print(&list_e);
    for(int i=0;i<90;i++)
    {
        elem=rand()%100;
        list_append(&list_e,elem);
        list_print(&list_e);
    }
    list_set_pos(&list_e,list_e.list_length/2);
    list_insert(&list_e,99);
    list_print(&list_e);
	printf("HELLO WORLD!!!\n");
    list_pre(&list_e);
    list_insert(&list_e,200);
    list_print(&list_e);
    list_next(&list_e);
    list_insert(&list_e,300);
    list_print(&list_e);
    list_remove(&list_e,&elem);
    list_print(&list_e);
    list_clear(&list_e);
    list_print(&list_e);
    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值