C语言数据结构顺序表的使用

数据结构之线性表

#2.1.1线性表的定义

InitList初始化列表
GetLength获取长度
GetElem查找元素
Locate找出…的准确位置
InsElem插入元素
define定义
typedef定义类型
struct结构体
MAXLEN序列最大值

顺序表的完整代码

#include <stdio.h>
#define MAXLEN 100
typedef int DataType;
typedef struct
{ DataType data[MAXLEN];
  int Length;
}SeqList;
void Meun()
{  /*显示菜单子函数*/
   printf("\n               顺序表的各种操作");
   printf("\n=================================================");
   printf("\n               1--建立顺序表                    |");
   printf("\n               2--插入元素                      |");
   printf("\n               3--删除元素                      |");   
   printf("\n               4--按位置查找元素                |");
   printf("\n               5--按元素值查找其在表中位置      |");
   printf("\n               6--求顺序表长度                  |");
   printf("\n               0--返回                          |");
   printf("\n=================================================");
   printf("\n请输入菜单号(0-6);");
}
void Initlist(SeqList *L)
{ /*初始化顺序表*/
  L->Length=0; 
}
void CreateList(SeqList *L,int n)
{ /*建立顺序表并输入多个函数*/
  int i;
  printf("请输入%d个整数:",n);
  for(i=0;i<n;i++)
      scanf("%d",&L->data[i]);
  L->Length=i;
}
void DispList(SeqList *L) 
{
	int i;
	for(i=0;i< L->Length;i++)
	   printf("%5d",L->data[i]);
}
int GetElem(SeqList *L,int i,DataType *x)
{
	if(i<1||i>L->Length)
	return 0;
	else
	{
		*x = L->data[i-1];
		return 1;
	}
}
int Locate(SeqList *L,DataType x)
{
	int i=0;
	while(i<L->Length && L->data[i]!=x)
	i++;
	if(i>=L->Length)
	return 0;
	else
	return i+1;
}
int InsElem(SeqList *L,int i,DataType x)
{
	int j;
	if (L->Length>=MAXLEN)
	{ printf("位置已满!");
	  return -1;
	}
	if(i<1||i>L->Length+1)
	{
		printf("插入位置出错!");
		return 0;
	 } 
	if (i == L->Length+1)
	{ 
	  L->data[i-1]=x;
	  L->Length++;
	  return 1;
	}
	for( j=L->Length-1; j>=i-1; j--)
	    L->data[j+1]=L->data[j];
	    L->data[i-1]=x;
	    L->Length++;
	    return 1;
}
int DelElem (SeqList *L,int i,DataType *x)
{
	int j;
	if(L->Length==0)
	{
		printf("顺序表为空!");
		return 0;
		 
	}
	if(i<1||i>L->Length)
	{
		printf("不存在第i个元素");
		return 0; 
	}
	*x= L->data[i-1];
	for(j=i;j<L->Length;j++)
	L->data[j-1]=L->data[j];
	L->Length--;
	return 1;
}
int main()
{
	SeqList L;
	DataType x;
	int n,i,loc;
	char ch1,ch2,a;
	ch1='y';
	while(ch1=='y'||ch1=='Y')
	{ Meun();
	  scanf("%c",&ch2);
	  getchar();
	  switch(ch2)
	{	
	    case '1':
		   
			printf("请输入建立线性表的个数:");
			scanf("%d",&n);
			CreateList(&L,n);
			printf("建立的线性表为:");
			DispList(&L);
			break;
		case '2':
		    printf("请输入要插入位置:");
		    scanf("%d",&i);
		    printf("请输入要插入元素值:");
		    scanf("%d",&x);
		    if(InsElem(&L,i,x)){
		    	printf("已成功在%d的位置上插入%d,插入后的线性表为\n",i,x);
		    	DispList(&L);
			}
			else
			    printf("输入插入的参数错误!");
			break;
		case'3':
			printf("请输入要删除元素的位置:");
			scanf("%d",&i);
			if(DelElem (&L,i,&x))
			{
				printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n",i,x);
				DispList(&L);
			} 
			else
			printf("\n输入删除的参数错误!");
			break;
		case'4':
		    printf("请输入要查看表中元素的位置(从1开始):");
			scanf("%d",&i);
			if(GetElem(&L,i,&x)) 
			{
				printf("当前线性表第%d个元素的值为:%d",i,x);
			}
			else
			printf("输入的位置有错误"); 
			break;
		case'5':
		    printf("请输入要查找的元素值为: ");
			scanf("%d",&x);
		    loc=Locate(&L,x);
			if(loc)
			printf("查找元素值为%d的位置为:%d",x,loc) ;
			else
			printf("该表中无此元素!");
			break;
		case'6':
		    printf("当前线性表的长度为:%d",L.Length);
			break;
		case'0':
		    ch1='n';break;
		default:
		    printf("输入有误,请输入0~6进行选择!"); 
	}     
	if(ch2!='0')
	{ printf("\n按回车键继续,按任意键返回主菜单!\n");
	  a=getchar();
	  if(a!='\xA')
	  {
	  	getchar();ch1='n';
	  }
	 } 
	}
}


  1. 线性表的定义
  2. 线性表的举例
  3. 线性表的特点
  4. 线性表的二元组表示

线性表的定义:
线性表是指具有相同数据类型的n(n>=0)个元素的有限序列。
其中n为表长,当其n=0时称之为空表。


线性表的举例:
(1)简单的线性表。
如二十六个英文字母:(a,b,c,d,e,f,—x,y,z)
如一个星期七天(1,2,3,4,5,6,7)
(2)复杂的线性表是由若干个数据项(Item)组成,而若干个含有大量记录的线性表称之为文件(File)。
线性表中的元素可以是各种类型,但是同一线性表中的元素必须是同种类型的。


3.线性表的特点

  1. 开始结点只有一个后继,没有前驱。
  2. 终止结点只有一个前驱,没有后继。
  3. 除了开始结点与终止结点以外,其余的结点都有且仅有一个直接前驱和一个直接后继。

4.线性表的二元组的表示
Linearity=(D,R)


2.1.2线性表的操作

1.初始化线性表InitList(L)
初始条件:表不存在。
操作结果:建立一个空表L(n==0)
操作说明:使表初始化,建立一个空表,将L设置为指针参数,将表L的实际长度设置为0,代码如下:

void InitList( SeqList  *L)
{/*初始化顺序表函数L*/
  L->Length=0;//L表的长度为0,为空表;
}

2.求线性表的长度GetLength(L)
初始条件:线性表L存在
操作结构:返回线性表L的长度(即所含数据元素的个数)


3.按位置查找操作GetElem(L,i,x)
初始条件:线性表L存在,i是表中的元素位置,x是找到该元素返回的值。
操作结构:在线性表L查找第i位上的数据元素,其作用是若第i位上有数据元素,则直接由x传回该元素值,返回1,若没有则为0。
操作说明:顺序的查找分为两种:1.按位置查找,2.按序号查找。
(1)按位置查找元素。查找顺序表中的第i个元素,在i无效时返回其值是错误的,在i有效时返回其值成功,用指针x所指向的变量传回第i个元素的值。
算法如下:

int GetElem(SeqList *L,int i,DataType *x)
{/*获取顺序表中的第i位的元素函数*/
   if(i<1||i>L->Length)//当i小于1或者大于其顺序表L的长度时,i时错误的
   return 0else//当查找元素时正确的时候
   {
    *x = L->data[i-1];//将顺序表中的第i个元素赋予指针x所指的变量
    //因为指针的下表时从0开始的,所以i-1;
    return 1;
   }
}

4.按值查找操作Locate(L,x)。

初始条件:线性表L存在,x是给定的一个待查数据元素。
操作结构:在线性表L查找一个与给定值x相等的数据元素,其作用是若存在一个或多个与x相等的数据元素,则返回所在位置的最小值或者地址值;否则返回0或者NULL值。
操作说明:顺序表中的按值查找是指在顺序表中查找与给定值x相等的数据袁元素所在的位置,其先令i的值为0,然后从表中的第一个位置开始查找值为x的元素。当i小于表长且该位置元素值不为x时,i自增,直到循环结束为止。判断i值,若i值大于表长则查找失败返回0,否则表示查找成功返回其位置i+1(因为C语言下标从0开始,所以位置值为下标+1)。算法如下:

int Locate(SeqList *L,DataType  x)
{//在顺序表L中定位元素x函数
   int i=0;
   while(i<L->Length && L->data[x]!=x)
   //i不大于L的长度且数据数组X中的值不等于x
       i++;
    if(i>L->Length)
    return 0;
    else
    return i+1;
}

5插入操作InsElem(L,x)
初始条件:线性表L存在且插入位置正确(1 <= i <= n+1,n为插入前表的长度)
操作结果:在线性表L的第i个位置上插入一个值为X的新元素。
如图:在这里插入图片描述
操作说明:线性表的插入是指在表的第i个位置上(因为C语言的下标是从0开始的,所以插入位置下标为i-1)插入一个值为x的新元素,插入后使表长增1,成为表的长度为n+1的表。
注意
1.要检查顺序表是否已满,在表满的情况下是不可以察隅,否则会产生溢出错误。
2.检查插入位置的有效性,插入的有效范围是1 <= i <=n+1,其中n为原表长。
3.注意数据移动的方向,必须是从原线性表最后一个结点起往后移动。
算法如下

int InsElem(SeqList *L,int i,DataType x)
{//在顺序表L中的第i位插入新元素x函数
  	int j;
	if (L->Length>=MAXLEN)
	//如果顺序表L的长度位最大值长度MAXLEN
	{
	  printf("位置已满!");
	  return -1;
	}
	if(i<1||i>L->Length+1)
	//如果i的值小于1,或i大于顺序表L的长度
	//下标从0开始
	{
		printf("插入位置出错!");
		return 0;
	 } 
	if (i == L->Length+1)
	{ 
	  L->data[i-1]=x;
	  L->Length++;
	  return 1;
	}
	for( j=L->Length-1; j>=i-1; j--)
	    L->data[j+1]=L->data[j];
	    L->data[i-1]=x;
	    L->Length++;
	    return 1;
}

在这里插入图片描述
6删除操作DelElem(L,i,x)
初始条件:线性表L存在且删除位置正确(1<=i<=n,n为插入前表的长度)
操作说明:线性表的删除操作是指讲第i个元素(因为C语言是从下表0开始的,所以删除位置下表为i-1)从顺序表去吊,删除后顺序表表长减1。
操作结果:删除线性表L的第i个位置的数据元素并用x将其储存。

int DelElem (SeqList *L,int i,DataType *x)
{//在顺序表L中删除第i为元素函数
	int j;
	if(L->Length==0)
	{
		printf("顺序表为空!");
		return 0;
		 
	}
	if(i<1||i>L->Length)
	{
		printf("不存在第i个元素");
		return 0; 
	}
	*x= L->data[i-1];//用指针变量x返回删除的元素值
	for(j=i;j<L->Length;j++)//结点移动
	L->data[j-1]=L->data[j];
	L->Length--;//顺序表长度减1
	return 1;//删除成功,返回
}

在这里插入图片描述
7.显示操作DispList(L)
初始条件:线性表L存在,且非空
操作说明:其作用是依次扫描线性表L,并输出各元素的值。
操作说明:从头到尾扫描顺序表L,输出表中各元素的值,算法如下:

void DispList(SeqList *L) 
{
	int i;
	for(i=0;i< L->Length;i++)
	   printf("%5d",L->data[i]);
}

8.显示菜单函数

void Meun()
{  /*显示菜单子函数*/
   printf("\n               顺序表的各种操作");
   printf("\n=================================================");
   printf("\n               1--建立顺序表                    |");
   printf("\n               2--插入元素                      |");
   printf("\n               3--删除元素                      |");   
   printf("\n               4--按位置查找元素                |");
   printf("\n               5--按元素值查找其在表中位置      |");
   printf("\n               6--求顺序表长度                  |");
   printf("\n               0--返回                          |");
   printf("\n=================================================");
   printf("\n请输入菜单号(0-6);");
}

顺序表的类型定义

#define MAXLEN 100
typedef int DataType;//定义DataType为整型
typedef struct//顺序表储存类型
{
DataType data[MAXLEN];//存放线性表的数组
int Length;

}SeqList;
SeqList L;//定义一个顺序表L

顺序表的主函数

int main()
{
	SeqList L;//定义顺序表L
	DataType x;//定义数据类型 x
	int n,i,loc;
	char ch1,ch2,a;
	ch1='y';
	while(ch1=='y'||ch1=='Y')
	{ Meun();
	  scanf("%c",&ch2);
	  getchar();
	  switch(ch2)
	{	
	    case '1':
		   
			printf("请输入建立线性表的个数:");
			scanf("%d",&n);
			CreateList(&L,n);
			printf("建立的线性表为:");
			DispList(&L);
			break;
		case '2':
		    printf("请输入要插入位置:");
		    scanf("%d",&i);
		    printf("请输入要插入元素值:");
		    scanf("%d",&x);
		    if(InsElem(&L,i,x)){
		    	printf("已成功在%d的位置上插入%d,插入后的线性表为\n",i,x);
		    	DispList(&L);
			}
			else
			    printf("输入插入的参数错误!");
			break;
		case'3':
			printf("请输入要删除元素的位置:");
			scanf("%d",&i);
			if(DelElem (&L,i,&x))
			{
				printf("已成功在第%d的位置上删除%d,删除后的线性表为:\n",i,x);
				DispList(&L);
			} 
			else
			printf("\n输入删除的参数错误!");
			break;
		case'4':
		    printf("请输入要查看表中元素的位置(从1开始):");
			scanf("%d",&i);
			if(GetElem(&L,i,&x)) 
			{
				printf("当前线性表第%d个元素的值为:%d",i,x);
			}
			else
			printf("输入的位置有错误"); 
			break;
		case'5':
		    printf("请输入要查找的元素值为: ");
			scanf("%d",&x);
		    loc=Locate(&L,x);
			if(loc)
			printf("查找元素值为%d的位置为:%d",x,loc) ;
			else
			printf("该表中无此元素!");
			break;
		case'6':
		    printf("当前线性表的长度为:%d",L.Length);
			break;
		case'0':
		    ch1='n';break;
		default:
		    printf("输入有误,请输入0~6进行选择!"); 
	}     
	if(ch2!='0')
	{ printf("\n按回车键继续,按任意键返回主菜单!\n");
	  a=getchar();
	  if(a!='\xA')
	  {
	  	getchar();ch1='n';
	  }
	 } 
	}
}

往以上内容对学习数据结构的同学有所帮助

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值