您的位置:首页 > 理论基础 > 数据结构算法

数据结构—线性表之顺序表的操作

2013-06-27 16:27 387 查看
数据结构中,线性表之顺序表的操作,包括初始化、创建顺序表、插入,删除,查找
#include <stdio.h>
#include <stdlib.h>

/**
  * @brief 线性表的顺序存储结构,在存、读数据时不管是哪个位置,时间复杂度都为O(1)
  *        而插入或删除时,时间复杂度为O(n)
  *        比较适合元素个数不太变化,而更多是存取数据的应用
  */
//顺序表的结构定义
#define MAXSIZE 10

typedef struct {
	int data[MAXSIZE];	//数组长度是存放线性表的存储空间的长度,存储分配后这个量是不变的
	int length;			//线性表的长度是线性表中数据元素的个数,随插入和删除操作,量会变化
}Sqlist;

/**
  * @brief 初始化顺序表
  */
void initList(Sqlist *L)
{
	int i;
	for ( i = 0; i < MAXSIZE; ++i ) {
		L->data[i] = 0;
	}
	L->length = 0;
}
/**
  * @brief 创建顺序表
  */
void createList(Sqlist *L)
{
	int i;
	L->length = 5;	//线性表中数据元素的个数为5

	int element[5] = { 1, 2, 3, 4, 5 };
	for ( i = 0; i < L->length; ++i ) {
		L->data[i] = element[i];	//把数组元素依次赋值给 线性表
	}
}
/**
  * @brief 获取元素操作
  */
int getElement(Sqlist *L, int i, int *e)
{
	if ( L->length == 0 || i < 1 || i > L->length ) 
		return 0;
	*e = L->data[i - 1];
	return 1;
}

/**
  * @brief 在L中第i个位置之前插入新的数据元素e,L的长度加1
  */
int insertList(Sqlist *L, int i, int e)//因为L本身要发生改变,这里用引用型
{
	int j;
	if ( L->length == MAXSIZE || i < 1 || i > L->length + 1 )
		return 0;
	if ( i <= L->length ) {//若插入的数据位置不在表尾
		for ( j = L->length; j >= i; --j )
			L->data[j] = L->data[j - 1];
	}
	//printf("enter!\n");
	L->data[i - 1] = e;
	L->length++;
	return 1;
}

/**
  * @brief 删除L中第i个数据元素,并用e返回其值,L的长度减1
  */
int deleteList(Sqlist *L, int i, int *e)
{
	int j;
	if ( i < 1 || i > L->length )
		return 0;
	if ( i <= L->length ) {//若删除的数据位置不在表尾
		for ( j = i - 1; j <= L->length - 1; ++j ) {
			L->data[j] = L->data[j + 1];
		}
	}
	*e = L->data[i - 1];
	L->length--;
	return 1;
}
/**
  * @brief 找出顺序表里面与给定参数相同的元素的位置
  * @param e为要找的数据元素
  */
int locatePos(Sqlist *L, int e)
{
	int i;
	for ( i = 0; i < L->length; ++i ) {

		if ( L->data[i] == e )
			return i + 1;
		if ( i == L->length - 1 ) {
			printf("can't find!\n");
			return -1;
		}
	}
}
/**
  * @brief 打印输出顺序表里面的数据
  */
void printList(Sqlist *L)
{
	int i; 
	for ( i = 0; i < L->length; ++i ) {
		printf("%d ", L->data[i]);
	}
	printf("\n");
}

int main()
{
	int choice = 0;
	int postion = 0;
	int element = 0;
	int retval = 0;
	
	Sqlist *L = (Sqlist *)malloc(sizeof(Sqlist));

	printf("1.init\n");
	printf("2.creat\n");
	printf("3.insert\n");
	printf("4.delete\n");
	printf("5.locate_value\n");
	printf("6.locate_pos\n");
	//printf("7.print\n");
	printf("0.exit\n");

	while ( 1 ) {
		printf("please input your choice:");
		scanf("%d", &choice);

		switch ( choice ) {
		case 1 : 
			initList(L); 
			printList(L); 
			//printf("enter!");
			break;
		case 2 : 
			createList(L); 
			printList(L); 
			break;
		case 3 :
			printf("the postion and element of insert:\n");
			scanf("%d %d", &postion, &element);
			insertList(L, postion, element); 
			printList(L);
			break;
		case 4 :
			printf("the postion of delete:\n");
			scanf("%d", &postion);
			deleteList(L, postion, &element); 
			//printf("the element of delete:%d", element);
			printList(L);
			break;
		case 5 :
			printf("the postion of searching elment:\n");
			scanf("%d", &postion);
			getElement(L, postion, &element); 
			printf("the element of search=%d\n", element);
			//printList(L);
			break;
		case 6 :
			printf("the element of find:");
			scanf("%d", &element);
			retval = locatePos(L, element);
			printf("the postion of find element:%d\n", retval);
			break;
		//case 7 : printList(); break;
		case 0 : exit(0);
		}
	}
	free(L);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: