课本第一个习题吧
一、线性表的概念:
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;