#2.1.1线性表的定义
InitList | 初始化列表 |
GetLength | 获取长度 |
GetElem | 查找元素 |
Locate | 找出…的准确位置 |
InsElem | 插入元素 |
define | 定义 |
typedef | 定义类型 |
struct | 结构体 |
MAXLEN | 序列最大值 |
#include
#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';
}
}
}
}
线性表的定义:
线性表是指具有相同数据类型的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.线性表的特点
4.线性表的二元组的表示
Linearity=(D,R)
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 0;
else//当查找元素时正确的时候
{
*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';
}
}
}
}
往以上内容对学习数据结构的同学有所帮助