线性表的基本操作过程:
(1)Setnull(L)置空表
(2)Length(L)求表长度和表中各个元素
(3)Get(L,i)获取表中第i个元素
(4)Prior(L,i)获取i的前驱元素
(5)Next(L,i)获取i的后继元素
(6)Locate(L,x)返回指定元素在表中位置
(7)Insert(L,i,x)插入新元素
(8)Delete(L,x)删除已存在元素
(9)Empty(L)来判断表是否为空
顺序表的基本操作
(1)计算顺序表的长度
数组的最小索引是0,顺序表的长度就是数组中最后一个元素的索引last+1。
清空操作是指清空顺序表中的数据元素,使顺序表为空,此时last等于-1。
如果顺序表的last为-1,则顺序表为空,返回ture,否则返回false。
如果顺序表为满,last等于maxsize-1,则返回true,否则返回false。
在顺序表未满的情况下进行附加操作,在表的末端添加一个新元素,然后使顺序表的last加1。
第一步:判断顺序表的状态,判断是否已满和插入位置是否正确,当表满或插入的位置不正确时不能插入
第二步:当表未满并且插入的位置正确时,将an~ai依次向后移动,为新的数据元素空出位置。在算法中用循环实现
第三步:将新的数据元素插入到空出的第i个位置上
第四步:修改last表长,使其仍指向顺序表的最后一个数据元素
第一步:判断顺序表是否为空以及删除的位置是否正确,如果表空或删除的位置不正确,则不能删除
第二步:如果表未空并且删除的位置正确,则将a+1~an依次向前移动,在算法中需要用循环来实现
第三步:修改last(相当于修改表长),使它仍只想顺序表的最后一个元素
顺序表操作实现程序
(1)Setnull(L)置空表
(2)Length(L)求表长度和表中各个元素
(3)Get(L,i)获取表中第i个元素
(4)Prior(L,i)获取i的前驱元素
(5)Next(L,i)获取i的后继元素
(6)Locate(L,x)返回指定元素在表中位置
(7)Insert(L,i,x)插入新元素
(8)Delete(L,x)删除已存在元素
(9)Empty(L)来判断表是否为空
顺序表的基本操作
(1)计算顺序表的长度
数组的最小索引是0,顺序表的长度就是数组中最后一个元素的索引last+1。
public int GetLength
{
return last+1;
}
(2)清空操作
清空操作是指清空顺序表中的数据元素,使顺序表为空,此时last等于-1。
public void Clear()
{
last=-1;
}
(3)判断线性表是否为空
如果顺序表的last为-1,则顺序表为空,返回ture,否则返回false。
public bool IsEmpty
{
if(last==-1)
{
return ture;
}
else
{
return false;
}
}
(4)判断顺序表是否为满
如果顺序表为满,last等于maxsize-1,则返回true,否则返回false。
public bool IsFull
{
if(last==maxsize-1)
{
return ture;
}
else
{
return false;
}
}
(5)附加操作
在顺序表未满的情况下进行附加操作,在表的末端添加一个新元素,然后使顺序表的last加1。
public void Append(T item)
{
if(IsFull)
{
Console.WriteLine("List is full");
return ;
}
data[++last]=item;
}
(6)插入操作
第一步:判断顺序表的状态,判断是否已满和插入位置是否正确,当表满或插入的位置不正确时不能插入
第二步:当表未满并且插入的位置正确时,将an~ai依次向后移动,为新的数据元素空出位置。在算法中用循环实现
第三步:将新的数据元素插入到空出的第i个位置上
第四步:修改last表长,使其仍指向顺序表的最后一个数据元素
public void Insert(T item,int i)
{
//判断顺序表是否已满
if(IsEmpty())
{
Console.WriteLine("List is full");
return ;
}
//判断插入位置是否正确
//i小于1表示在第1个位置之前插入
//i大于last+2表示在最后一个元素后面的第2个位置插入
if(i<1||i>last+2)
{
Console.WriteLine("Position is error!");
return ;
}
//在顺序表的尾表插入数据元素
if(i==last+2)
{
data[i-1]=item;
}
else //在表的其他位置插入数据元素
{
//元素移动
for(int j=last;j>=i-1;--j)
{
data[j+1]=data[j];
}
//将新的数据元素插入到空出的第i个位置上
data[i-1]=item;
}
//修改表长
++last;
}
(7)删除操作
第一步:判断顺序表是否为空以及删除的位置是否正确,如果表空或删除的位置不正确,则不能删除
第二步:如果表未空并且删除的位置正确,则将a+1~an依次向前移动,在算法中需要用循环来实现
第三步:修改last(相当于修改表长),使它仍只想顺序表的最后一个元素
public T Delete(int i)
{
T tem=default(T);
//判断是否为空
if(IsEmpty())
{
Console.WriteLine("List is empty");
return tmp;
}
//判断删除的位置是否正确
//i小于1表示删除第1个位置之前的元素
//i大于last+1表示删除最后一个元素后面的第1个位置的元素
if(i<1||i>last+1)
{
Console.WriteLine("Position is error!");
return tmp;
}
//删除的是最后一个元素
if(i==last+1)
{
tmp=data[last--];
return tmp;
}
else //删除的步是最后一个元素
{
//元素移动
tmp=data[i-1];
for(int j=i;j<=last;++i)
{
data[j]=data[j+1];
}
}
//修改表长
--last;
return tmp;
}
(8)取表元
public T GetElem(int i)
{
if(IsEmpty()||(i<1)||(i>last+1))
{
Console.WriteLine("List is empty or Position is error!");
return default(T);
}
return data[i-1];
}
(9)按值查找
public int Locate(T value)
{
//顺序表为空
if(IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}
int i=0;
//循环处理顺序表
for(i=0;i<=last;++i)
{
//顺序表中存在与给定值相等的元素
if(value.Equals(data[i]))
{
break;
}
}
//顺序表中步存在与给定值相等的元素
if(i>last)
{
return -1;
}
return i;
}
顺序表操作实现程序
#include<stdio.h>
typedef struct
{
char key[15]; //结点的关键字
char name[20];
int age;
}DATA; //定义结点类型,可定义为简单类型,也可以定义为结构
#include "2-1 SeqList.h" //自己的定义的头文件
#include "2-2 SeqList.c"
int SeqListAll(SeqListType *SL) //遍历顺序表中的结点
{
int i;
for(i=1;i<=SL->ListLen;i++)
printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
void main()
{
int i;
SeqListType SL; //定义顺序表变量
DATA data,*data1; //定义结点保存数据类型变量和指针变量
char key[15]; //保存关键字
SeqListInit(&SL); //初始化顺序表
do{ //循环添加结点数据
printf("输入添加的结点(学号 姓名 年龄): ");
fflush(stdin); //清空输入缓冲区
scanf("%s%s%d",&data.key,&data.name,&data.age);
if(data.age) //若年龄不为0
{
if(!SeqListAdd(&SL,data)) //退出死循环
break;
}
else //若年龄为0
break; //退出死循环
}while(1);
printf("\n顺序表中的结点顺序为:\n");
SeqListAll(&SL); //显示所有结点数据
fflush(stdin); //清空输入缓冲区
printf("\n要去除的结点序号: ");
scanf("%d",&i); //输入结点序号
data1=SeqListFindByNum(&SL,i); //按序号查找结点
if(data1)
printf("第%d个结点为:(%s,%s,%d)",i,data1->key,data1->name,data1->age);
fflush(stdin); //清空输入缓冲区
printf("\n要查找结点的关键字: ");
i=SeqListFindByCont(&SL,key); //按关键字查找,返回结点序号
data1=SeqListFindByNum(&SL,i); //按序号查找,返回结点指针
if(data1)
printf("第%d个结点为:(%s,%s,%d)\n",i,ata1->key,data1->name,data1->age);
getchar();
}