线性表的基本操作过程:
(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(); }