线性表--------顺序表

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


猜你喜欢

转载自blog.csdn.net/qq_41398448/article/details/80413120