数组实现线性表的顺序存储

课本第一个习题吧

一、线性表的概念:
    1、线性表是一种最简单、最常用的数据结构,通常一个线性表是由n(n>=0)个性质相同的数据元素组成的有限序列,长度即为元素的个数n,当n=0时,称该表为空表。
    2、非空的线性结构的特点:它具有惟一的第一个数据元素和最后一个数据元素;并且除了第一个元素以外,其他数据元素都只有一个前驱和一个后继。
    3、线性表的主要存储结构:顺序存储结构 和 链式存储结构。(本篇主要总结顺序存储结构)
 
二、线性表的顺序表示和实现
   顺序存储结构的存储可以用一维数组表示,具有固定长度。
   也可以用动态分配的存储结构,可以合理地利用空间。

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;

#define OK 1
#define OVERFLOW -1
#define ERROR -2
#define MAXSIZE 100

typedef int ElemType;

typedef struct List
{
	ElemType elem[MAXSIZE];
	int length;
}List;

List InitList()
{
	List L;
	memset(L.elem, -1, sizeof(L.elem));
	L.length = 0;
	cout << "顺序表已初始化" << endl << endl;
	return L;
}

void ClearList(List *L)
{
	memset(L->elem, -1, sizeof(L->elem));
	L->length = 0;
	cout << "顺序表已清空" << endl << endl;
}

void EmptyList(List *L)
{
	if(L->length == 0)
	{
		cout << "顺序表为空" << endl << endl;
	}
	else
	{
		cout << "顺序表不为空" << endl << endl;
	}
}

void FullList(List *L)
{
	if(L->length == MAXSIZE)
	{
		cout << "顺序表已满" << endl << endl;
	}
	else
	{
		cout << "顺序表未满" << endl << endl;
	}
}

int ListLength(List *L)
{
	return L->length;
}

void TraverseList(List *L)
{
	if(L->length == 0)
	{
		cout << "顺序表为空" << endl;
	}
	else
	{
		cout << "当前顺序表中的元素为:" << endl;
		for(int i = 1; i <= L->length; i++)
		{
			cout << L->elem[i-1] << " ";
		}
		cout << endl << endl;
	}
}

ElemType GetList(List *L, int i)
{
	if(i < 1 || i > L->length)
	{
		cout << "要查询的位置出错" << endl << endl;
	}
	else
	{
		return L->elem[i-1];
	}
}

int LocateList(List *L, ElemType e)
{
	int i;
	for(i = 0; i < L->length; i++)
	{
		if(e == L->elem[i])
		{
			return i + 1;
		}
	}
	if(i >= L->length)
	{
		return ERROR;
	}
}

void InsertList(List *L, int i, ElemType e)
{
	if(L->length == MAXSIZE)
	{
		cout << "顺序表满,不能插入元素" << endl;
	}
	else if(i < 1 || i > L->length)
	{
		cout << "插入位置不正确" << endl;
	}
	else
	{
		for(int j = L->length - 1; j >= i - 1; j--)
		{
			L->elem[j+1] = L->elem[j];
		}
		L->elem[i-1] = e;
		L->length++;
	}
}

void DeleteList(List *L, int i)
{
	ElemType e;
	if(i < 1 || i > L->length)
	{
		cout << "删除位置不正确" << endl << endl;
	}
	else
	{
		e = L->elem[i-1];
		for(int j = i; j <= L->length; j++)
		{
			L->elem[j-1] = L->elem[j];
		}
		L->length--;
		cout << e << "元素已被删除" << endl << endl;
	}
}

void PreList(List *L, ElemType e)
{
	int i = 0;
	while(i < L->length && L->elem[i] != e)
	{
		i++;
	}
	if(i == 0)
	{
		cout << "第一个元素没有前驱" << endl << endl;
	}
	else if(i <= L->length - 1)
	{
		cout << e << " 元素的前驱为 " << L->elem[i-1] << endl << endl;
	}
	else
	{
		cout << "不存在元素" << e << endl << endl;
	}
}

void NextList(List *L, ElemType e)
{
	int i = 0;
	while(i < L->length && L->elem[i] != e)
	{
		i++;
	}
	if(i == 0)
	{
		cout << "第一个元素没有前驱" << endl << endl;
	}
	else if(i <= L->length - 1)
	{
		cout << e << " 元素的后继为 " << L->elem[i+1] << endl << endl;
	}
	else
	{
		cout << "不存在元素" << e << endl << endl;
	}
}

void RandomList(List *L)
{
	ClearList(L);
	srand((unsigned)time(NULL));
	int length;
	length= rand() % 100;
	L->length = length;
	for(int j = 0 ; j < length; j++)
	{
		L->elem[j] = rand() % 100;
	}
	cout << "随机数据已生成" << endl << endl;
}

int scan()
{
	int n;
	cout << "-----------------++++++++++++++++++-------------------" << endl;
	cout << "                请选择所要进行的操作                  " << endl;
	cout << "1.初始化  2.清空  3.求顺序表长度  4.检查顺序表是否为空" << endl;
	cout << "5.检查顺序表是否为满 6.遍历顺序表 7.从顺序表中查找元素" << endl;
	cout << "8.从顺序表中查找与给定元素值相同的元素在顺序表中的位置" << endl;
	cout << "9.向顺序表中插入元素            10. 从顺序表中删除元素" << endl;
	cout << "11.求元素的前驱     12.求元素的后继    13.生成随机数据" << endl;
	cout << "-----------------++++++++++++++++++-------------------" << endl;
	cin >> n;
	return n;
}

int main()
{
	int quit = 0;
	int i;
	List L;
	ElemType e;
	while(!quit)
	{
		switch (scan())
		{
			case 1 : L = InitList();break;
			case 2 : ClearList(&L);break;
			case 3 : cout << "顺序表的长度为:" << ListLength(&L) << endl << endl;break;
			case 4 : EmptyList(&L);break;
			case 5 : FullList(&L);break;
			case 6 : TraverseList(&L);break;
			case 7 : cout << " 请输入要查询的元素的位置" << endl; cin >> i; cout << GetList(&L,i) << endl << endl;break;
			case 8 : cout << "请输入要查询的元素的值" << endl; cin >> e; cout << LocateList(&L,e) << endl << endl;break;
			case 9 : cout << "请输入要插入的元素和位置" << endl; cin >> e >> i; InsertList(&L,i,e);break;
			case 10: cout << "请输入要删除的元素的位置" << endl; cin >> i; DeleteList(&L,i);break;
			case 11: cin >> e; PreList(&L,e);break;
			case 12: cin >> e; NextList(&L,e);break;
			case 13: RandomList(&L);break;
			default:quit = 1;
		}
	}
	return 0;
}
----------------------------------------------------------------------------------------------------------------

写一算法,从顺序表中删除自第i个元素开始的k个元素。

void DeleteListFromI(List *L, int i, int k)
{
	ElemType e;
	if(i < 1 || i > L->length || k > L->length || i + k > L->length + 1)
	{
		cout << "删除位置不正确" << endl << endl;
	}
	else
	{
		e = L->elem[i-1];
		for(int j = i + k - 1; j <= L->length; j++)
		{
			L->elem[j-k] = L->elem[j];
		}
		L->length -= k;
		cout << "从" << e << "开始的" << k << "个元素已被删除" << endl << endl;
	


posted @ 2013-03-05 17:36  N3verL4nd  阅读(264)  评论(0编辑  收藏  举报