码迷,mamicode.com
首页 > 其他好文 > 详细

1.1顺序表基本操作的设计与实现

时间:2015-05-20 13:14:18      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

  实现顺序表的基本操作,包括顺序表的建立,查找,求长度,查找前驱,插入,删除,输出等函数

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

#define List_INIT_SPACE 100    //存储空间初始分配量
#define List_INC_SPACE 10      //存储空间分配增量

typedef int ElemType;
typedef struct
{
	ElemType *elem;              //存储空间基址
	int length;                  //当前长度
	int listsize;				//当前分配的存储容量(以sizeof(ElemType)为单位)
}Sq_List;

/****---------------------------------------------------------------------------------****/
//函数名:   Sq_ListInit(Sq_List &l)
//参数:     (传入)Sq_List L,顺序表结构体L,存储线性表相关信息(&相当于传入L的地址)
//返回值:    int型,返回1表示创建成功,0表示失败
//功能:      初始化一个空顺序表
/*****--------------------------------------------------------------------------------****/

int Sq_ListInit(Sq_List &L)
{
	//在内存中分配空间
	L.elem = (ElemType*)malloc(List_INIT_SPACE*sizeof(ElemType));
	if(!L.elem) exit(OVERFLOW);   //存储分配失败
	//构造一个空线性表L
	L.length = 0;
	L.listsize = List_INIT_SPACE;   //初始存储容量
	return OK;
}//函数Sq_listInit结束

/****----------------------------------------------------------------------****/
//函数名: LocateElem(Sq_List L, ElemType e)
//参数:  (传入)Sq_List L,顺序表
//		   (传入)ElemType e,定位元素
//返回值: int型,返回定位位置,0表示失败
//功能:   在顺序表中定位元素
/****----------------------------------------------------------------------****/

int LocateElem(Sq_List L, int e)
{
	int i = 1;
	//定义线性表指针
	int * p = L.elem;
	//查找元素e
	while(i < L.length && *p++ != e)
	{
		++i;
	}
	if(i <= L.length)
	{
		return i;
	}
	else
	{
		return ERROR;
	}
}
//求顺序表的长度
int GetListLength(Sq_List L)
{
	return L.length;
}

/****---------------------------------------------------------------------****/
//函数名:   Sq_listInsert(Sq_List &L, int i, ElemType e)
//参数:    (传入)Sq_List &l   顺序表
//         (传入)int i 插入位置
//         (传入)ElemType e 插入元素
//返回值:  1表示成功,0表示操作失败
//功能:      在顺序表L中的第i个位置前插入新元素e
//备注:     i的和合法值为1<= i <= 线性表长度+1
/****---------------------------------------------------------------------****/

int Sq_ListInsert(Sq_List &L, int i, ElemType e)
{
	//判断位置是否合法
	if(i < 1 || i > L.length+1)
	{
		cout <<"i 的值不合法!" << endl;
		return 0;
	}
	//超出空间进行再分配
	if(L.length >= L.listsize)
	{
		int *newspace;
		newspace = (ElemType*) realloc(L.elem,(L.listsize+List_INC_SPACE)*sizeof(ElemType));
		if(!newspace) exit(OVERFLOW);     //存储分配失败
		L.elem = newspace;                //新基址
		L.listsize += List_INC_SPACE;     //增加存储容量
	}
	int *p, *q;                           //定义指向线性表位置i和尾的指针
	q = &(L.elem[i-1]);                   //q指针指向插入位置i的前一个
	for(p = &(L.elem[L.length-1]); p >= q; --p)
	{
		*(p+1) = *p;                       //插入元素之后的元素右移
	}
	*q = e;                                //把元素e放在位置i处
	++L.length;                            //线性表长度增加1
	return OK;
}//Sq_ListInsert结束

/****------------------------------------------------------------------****/
//函数名:   Sq_listDelete(Sq_list &L, int i, ElemType &e)
//参数:    (传入)Sq_list &L 顺序表
//          (传入)int i   删除位置
//          (传出)ElemType &e删除元素
//返回值:   1表示成功,0表示操作失败
//功能:     在顺序线性表L中删除第i个元素,用e返回其值
//备注:     i的合法取值为1 <= i <= 线性表长度
/****------------------------------------------------------------------****/

int Sq_listDelete(Sq_List &L, int i, ElemType &e)
{
	//判断位置是否合法
	if(i < 1|| i > L.length+1)
	{
		cout << " i的值不合法!" << endl;
		return 0;
	}
	int *p, *q;                   //定义指向线性表位置i和尾的指针
	p = &(L.elem[i-1]);           //p为被删除元素的位置
	e = *p;                       //取删除元素的值
	q = L.elem + L.length -1;     //q指针指向线性表最后一个元素
	for(++p; p <= q; ++p)
	*(p-1) = *p;                 //被删除元素之后的元素左移
	 --L.length;                  //线性表长度减1
	 return OK;
}//函数Sq_ListDelete结束

//-------------------testing program---------------------------

int main()
{
	Sq_List R;    //定义实参
	int flag;
	//为了判断调用成功与否,可以检查flag的值,或者见插入操作的调用方法
	//if(flag == 1) cout << "成功";
	//else cout << "失败";
	flag = Sq_ListInit(R);

	// 调用方法
	int i = 1;
	int elem;
	cout << "the length of current list is " << GetListLength(R) << endl;
	cout << "input the element: ";
	cin >> elem;
	if(Sq_ListInsert(R, i, elem))   cout << "successed! " << endl;
	cout << "the length of current list is " << GetListLength(R) << endl;
	//Sq_ListInsert(R, i, elem);      //或者直接调用
	return 0;
}


1.1顺序表基本操作的设计与实现

标签:

原文地址:http://blog.csdn.net/bao_libra/article/details/45869255

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!