/*
============================================================================
Name : sequence_list.c
Author : ntsk13 beijiwei@qq.com
Version :
Copyright : GPL
Description : sequence list study, complement by C
Date : 2015.06.03
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#define SEQ_LIST_CAPACITY 100
typedef struct sl_element{
int elem;
int locate;//元素位置
}Sl_element,*Psl_element;
typedef struct seq_list{
Sl_element array[SEQ_LIST_CAPACITY];
int cur_len;//当前长度
int capacity;//容量
}Slist;
void Slist_init(Slist * L);
int Slist_is_empty(Slist * L);
int Slist_length(Slist * L);
void Slist_clear(Slist *L);
void Slist_get_element(Slist *L, int th,Psl_element pe);
void Slist_get_element_locate(Slist *L,Sl_element e,int *locate);
void Slist_get_last_element(Slist *L,Sl_element e,Psl_element pe);
void Slist_get_next_element(Slist *L,Sl_element e,Psl_element pe);
void Slist_insert_element(Slist *L,Sl_element e,int i);
void Slist_delete_element(Slist *L,int i);
void Slist_traverse(Slist *L);
int main(void) {
int i=0;
int data[10]={0,1,2,3,4,5,6,7,8,9};
Slist one;
Sl_element tmp,two,three,four;
Slist_init(&one);
for(i=0;i<10;i++)
{
tmp.elem=data[i];
tmp.locate=i;
Slist_insert_element(&one,tmp,i);
}
printf("The two elementis %d ,locate is %d\n",two.elem,two.locate);
fflush(stdout);
Slist_get_last_element(&one,tmp,&two);
Slist_get_last_element(&one,two,&three);
Slist_get_next_element(&one,three,&four);
printf("The two elementis %d ,locate is %d\n",two.elem,two.locate);
printf("The three elementis %d ,locate is %d\n",three.elem,three.locate);
printf("The four elementis %d ,locate is %d\n",four.elem,four.locate);
printf("Before delete 5 ,length=%d \n",one.cur_len);
Slist_traverse(&one);
Slist_delete_element(&one,5);
printf("After delete 5 length=%d \n",one.cur_len);
Slist_traverse(&one);
//printf("Before insert 5 ,20 \n");
Slist_insert_element(&one,two,5);
printf("After insert 5 length=%d \n",one.cur_len);
Slist_traverse(&one);
Slist_delete_element(&one,0);
Slist_delete_element(&one,1);
Slist_delete_element(&one,2);
Slist_delete_element(&one,3);
Slist_delete_element(&one,9);
printf("After delete 0,1,2,3,9 length=%d \n",one.cur_len);
Slist_traverse(&one);
return EXIT_SUCCESS;
}
void Slist_init(Slist * L)
{
(*L).capacity=SEQ_LIST_CAPACITY;
(*L).cur_len=0;
}
int Slist_is_empty(Slist * L)
{
if( (*L).cur_len==0 )
return 1;
else
return 0;
}
int Slist_length(Slist * L)
{
return (*L).cur_len;
}
void Slist_clear(Slist *L)
{
(*L).cur_len=0;
}
void Slist_get_element(Slist *L, int th,Psl_element pe)
{
*pe=(*L).array[th];
}
void Slist_get_element_locate(Slist *L,Sl_element e,int *locate)
{
*locate=e.locate;
}
void Slist_get_last_element(Slist *L,Sl_element e,Psl_element pe)
{
*pe=(*L).array[e.locate-1] ;
}
void Slist_get_next_element(Slist *L,Sl_element e,Psl_element pe)
{
*pe=(*L).array[e.locate+1] ;
}
void Slist_insert_element(Slist *L,Sl_element e,int i)
{
int length=(*L).cur_len;
int j=0;
if(i==length)
{
(*L).array[i]=e;
(*L).cur_len+=1;
(*L).array[i].locate=i;
return;
}
if(i>length)
{
puts("insert error,i > length!!!");
return;
}
if( length== (*L).capacity)
{
puts("sequence list full cannot insert!!!");
return;
}
for(j=length-1; j>=i;j--)
{
(*L).array[j+1]=(*L).array[j];
(*L).array[j+1].locate+=1;
}
(*L).array[i]=e;
(*L).cur_len+=1;
(*L).array[i].locate=i;
}
void Slist_delete_element(Slist *L,int i)
{
int length=(*L).cur_len;
int j=0;
if(i==length)
{
(*L).cur_len-=1;
return;
}
if(i>length || i < 0 )
{
puts("delete site error !!!");
return;
}
for(j=i; j<length;j++)
{
(*L).array[j]=(*L).array[j+1];
(*L).array[j].locate-=1;
}
(*L).cur_len-=1;
}
void Slist_traverse(Slist *L)
{
int i=0;
for(i=0;i<(*L).cur_len;i++)
{
printf("The %dth element is %d\n",i,(*L).array[i].elem);
fflush(stdout);
}
}