C++实现数据结构线性表顺序存储结构

线性表是一种常用的数据结构在实际应用中,线性表都是以、队列、字符串数组等特殊线性表的形式来使用的。由于这些特殊线性表都具有各自的特性,因此,掌握这些特殊线性表的特性,对于数据运算的可靠性和提高操作效率都是至关重要的。  线性表是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。

特征:

1.集合中必存在唯一的一个“第一元素”;
2.集合中必存在唯一的一个 “最后元素” ;
3.除最后一个元素之外,均有 唯一的后继(后件);
4.除第一个元素之外,均有 唯一的前驱(前件)。

java中的List接口,就是线性表。ArrayList就是顺序线性表,LinkedList就是链表线性表。

示例代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;

#define MAXSIZE 100
typedef int Elemtype;
//定义顺序表顺序存储结构
struct SqList
{
	Elemtype data[MAXSIZE];
	int length;
}_SqList;

//初始化线性表
bool InitList(SqList *ptr)
{
	for (int i = 0; i < MAXSIZE;i++)
	{
		ptr->data[i] = 0;
	}
	ptr->length = 0;
	return true;
}

//判断链表是否为空
bool isListEmpty(SqList *ptr)
{
	if (ptr->length == 0)
	{
		return true;
	}
	else
	    return false;
}

//清空链表
bool ClearList(SqList *ptr)
{
	for (int i = 0; i < ptr->length; i++)
	{
		ptr->data[i] = 0;
	}
	ptr->length = 0;
	return true;
}

//返回Sq中第1个与Elem满足关系的数据元素的位序,若这样的数据元素不存在,则返回值为0
int Locate(SqList Sq, Elemtype Elem)
{
	for (int i = 0; i < Sq.length; i++)
	{
		if (Sq.data[i] == Elem)
		{
			return i + 1;
		}
	}
	return 0;
}

//在Sq中第pos个位置之前插入新的数据元素Elem,L的长度加1
bool ListInsert(SqList* ptr, int pos, Elemtype Elem)
{
	if (ptr->length == MAXSIZE)
	{
		return false;
	}
	if (pos < 1 || pos > ptr->length + 1)
	{
		return false;
	}
	if (pos <= ptr->length)
	{
		for (int i = ptr->length - 1; i >= pos - 1;i--)
		{
			ptr->data[i + 1] = ptr->data[i];
		}
	}
	ptr->data[pos - 1] = Elem;//将新元素插入

	ptr->length++;
	return true;
}

//用ptr返回Sq中第pos个元素的值,注意Pos是指位置,第1个位置的数组是从0开始的
bool GetElem(SqList Sq, int pos, Elemtype* ptr)
{
	if (pos<1 || pos>Sq.length || Sq.length == 0)
	{
		return false;
	}
	*ptr = Sq.data[pos - 1];
	return true;
}

//删除Sq的第pos个数据元素,并用pe返回其值,sq的长度减1
bool ListDelete(SqList* sq, int pos, Elemtype* pe)
{
	if (pos<1 || pos>sq->length)
	{
		return false;
	}
	*pe = sq->data[pos - 1];
	for (int i = pos; i < sq->length;i++)
	{
		sq->data[i - 1] = sq->data[i];
	}
	sq->length--;
	return true;
}

//返回链表的长度
int ListLength(SqList sq)
{
	return sq.length;
}

//将所有在线性表pb中但不在pa中的元素插入到pa中
void UnionList(SqList* pa, SqList* pb)
{
	int lena = pa->length;
	int lenb = pb->length;
	int item;
	for (int i = 0; i < lenb;i++)
	{
		if (GetElem(*pb, i + 1, &item))
		{
			if (Locate(*pa, item) == 0)
			{
				ListInsert(pa, ++lena, item);
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	SqList *Sq = new SqList;
	InitList(Sq);
	if (!isListEmpty(Sq))
	{
		cout << "Sq: " << endl;
		for (int i = 0; i < ListLength(*Sq); i++)
			cout << Sq->data[i] << ' ';
	}
	cout << endl;

	int pos = Locate(*Sq, 2);
	if (pos != 0)
	{
		int result;
		ListDelete(Sq, pos, &result);
		cout << "delete: " << result << endl;
	}

	if (!isListEmpty(Sq))
	{
		cout << "Sq: " << endl;
		for (int i = 0; i < ListLength(*Sq); i++)
			cout << Sq->data[i] << ' ';
	}
	cout << endl;

	SqList Sq2;
	InitList(&Sq2);
	for (int i = 1; i < 4; i++)
		ListInsert(&Sq2, i, 6);
	ListInsert(&Sq2, 4, 7);
	if (!isListEmpty(&Sq2))
	{
		cout << "Sq2: " << endl;
		for (int i = 0; i < ListLength(Sq2); i++)
			cout << Sq2.data[i] << ' ';
	}
	cout << endl;

	UnionList(Sq, &Sq2);

	if (!isListEmpty(Sq))
	{
		cout << "Sq: " << endl;
		for (int i = 0; i < ListLength(*Sq); i++)
			cout << Sq->data[i] << ' ';
	}
	cout << endl;
	delete Sq;
	return 0;
}
参考文献:

1、http://www.bianceng.cn/Programming/sjjg/201308/37192.htm

2、http://blog.csdn.net/hguisu/article/details/7673703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i胡说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值