线性表(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;
}