简单数据结构之顺序表(C实现)

/*
 ============================================================================
 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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值