c语言线性表-顺序表(完整版)

news/2024/5/20 7:13:17 标签: c语言, 数据结构, 链表, 顺序表

c语言线性表顺序存储表示

这几天我尝试写写c语言顺序表,我是这样想的:在学链表之前,先搞懂顺序表
不喜勿喷,本人新手,大多代码借鉴书上。如有错误之处,请原谅!
首先创建一个结构体:

typedef struct
{
	ElemType *elem;//存储空间的基地址 
	int length;//当前长度 
}Sqlist;//顺序表的结构类型为Sqlist 

然后建立一个空表,并填上数据:

Status InitList(Sqlist &L)//建立一个空表 
{
	L.elem = new ElemType[MAXSIZE];
	if(!L.length)
	{
		exit(OVERFLOW);//OVERFLOW需要重定义
	}
	L.length = 0;
	return 0;
}

顺序表结构至此已经搭建好了,下一步便是往空表上填数据。

Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表 
{
	int b,i=0;
	printf("表的长度: ");
	scanf("%d",&L.length);
	Interrupt(); 
	printf("输入要填入表的数字:\n");
	for( ; i < L.length ; i++ )
	{
		scanf("%d",&b);	
		L.elem[i] = b;		
	}
	Interrupt(); 
	return 0;
}

剩下的工作,便是对自己所创建的顺序表进行修改,装饰。
顺序表操作包括:增,删,查。
为了观察输入的顺序表是否正确,先增加个 遍历函数

Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来 
{
	int j;
	if(L.length==0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据 
			printf("%d  ",L.elem[j]);
		printf("\n");//最后换行 
		return 0;
	}
}

顺序表的取值(按值查找):

Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数 
{
	scanf("%d",&i);
	Interrupt();
	if(i<0||i>L.length)//判断i的取值是否超范围 
	{
		printf("ERROR\n");//如果超范围,返回ERROR,并结束 
		return 0;
	}
	else
	{
		e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出 
		printf("%d\n",e);
		return 0;
	}
}

顺序表的删除操作:

Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置 
{
	int j;
	scanf("%d",&i);//输入要删除的第i位 
	Interrupt();
	if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位 
			L.elem[j-1] = L.elem[j];
		L.length = L.length-1;//表长减1 
		return 0;
	}
}

顺序表的插入:

Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入  i:为要插入的表的位置。e:要插入该位置的元素 
{
	int j;
	scanf("%d",&i);
	scanf("%d",&e);
	Interrupt();
	if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位 
			L.elem[j]=L.elem[j-1];
		L.elem[i-1]=e;//将新元素e放入第i个位置 
		++L.length;//表长加1 
		return 0;
	}
}

顺序表的查找(按位查找):

Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素 
{
	int j,i=0;
	bool text=true;//利用bool类型,来判断表里有没有值为e的值 
	scanf("%d",&e);//输入e的值 
	Interrupt();
	for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较, 
	{
		if(L.elem[j]==e)
		{
			printf("第 %d 位\n",j+1);
			i++;
			text=false;
		}
	}

	if(text)//bool类型的输出 
		printf("没有找到");
	return 0;
}

最后附上 完整代码c语言顺序表 存储结构。主函数中为了方便操作增加了一些代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100//顺序表所能表达的最大长度 
#define OVERFLOW 1



typedef int Status;//重命名,使Status和int有相同的作用
typedef int ElemType;

void Interrupt(void)//创建一个中断函数 
{
	while(1) //用于检测换行符,使函数脱离scanf的连续输出 
		if(getchar()=='\n')
			break;
}

typedef struct
{
	ElemType *elem;//存储空间的基地址 
	int length;//当前长度 
}Sqlist;//顺序表的结构类型为Sqlist 

Status InitList(Sqlist &L)//建立一个空表 
{
	L.elem = new ElemType[MAXSIZE];
	if(!L.length)
	{
		exit(OVERFLOW);
	}
	L.length = 0;
	return 0;
}

Status MyList(Sqlist &L)//在空表上输入数字,建立一个属于自己填写的表 
{
	int b,i=0;
	printf("表的长度: ");
	scanf("%d",&L.length);
	Interrupt(); 
	printf("输入要填入表的数字:\n");
	for( ; i < L.length ; i++ )
	{
		scanf("%d",&b);	
		L.elem[i] = b;		
	}
	Interrupt(); 
	return 0;
}

Status TraverseList(Sqlist &L)//遍历 ,使现有表中的数据重新打印出来 
{
	int j;
	if(L.length==0)
	{
		printf("空表\n");
		return 0;
	}
	else
	{
		for(j=0 ; j < L.length ; j++)//建立一个for函数,读取顺序表中的数据 
			printf("%d  ",L.elem[j]);
		printf("\n");//最后换行 
		return 0;
	}
}

Status GetElem(Sqlist &L,int i,int &e)//取值 。i:为要取的值得位置,&e:为i位置的接受变量,并且返回主函数 
{
	scanf("%d",&i);
	Interrupt();
	if(i<0||i>L.length)//判断i的取值是否超范围 
	{
		printf("ERROR\n");//如果超范围,返回ERROR,并结束 
		return 0;
	}
	else
	{
		e = L.elem[i-1];//返回将第i位置的数据赋值给e,并输出 
		printf("%d\n",e);
		return 0;
	}
	
}

Status DeleteElem(Sqlist &L,int i)//删除 。i:为要删除数据的位置 
{
	int j;
	scanf("%d",&i);//输入要删除的第i位 
	Interrupt();
	if(i<0||i>L.length)//判断输入的i 是否超范围,如果超出,返回错误。 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j = i; j<=L.length;j++)//被删除元素之后的元素都向前移一位 
			L.elem[j-1] = L.elem[j];
		L.length = L.length-1;//表长减1 
		return 0;
	}
}

Status ListInsert(Sqlist &L,int i,ElemType e)//顺序表的插入  i:为要插入的表的位置。e:要插入该位置的元素 
{
	int j;
	scanf("%d",&i);
	scanf("%d",&e);
	Interrupt();
	if(i>L.length+1||L.length>=MAXSIZE||i<1)//判断要插入表的位置i是否超出范围 
	{
		printf("ERROR\n");
		return 0;
	}
	else
	{
		for(j=L.length;j>=i;j--)//插入位置及之后的元素分别向后移一位 
			L.elem[j]=L.elem[j-1];
		L.elem[i-1]=e;//将新元素e放入第i个位置 
		++L.length;//表长加1 
		return 0;
	}
}

Status LocateElem(Sqlist &L,ElemType e)//查找。在顺序表L中查找值为e的数据元素 
{
	int j,i=0;
	bool text=true;//利用bool类型,来判断表里有没有值为e的值 
	scanf("%d",&e);//输入e的值 
	Interrupt();
	for(j=0;j<L.length;j++)//遍历整个顺序表,和e值一一作比较, 
	{
		if(L.elem[j]==e)
		{
			printf("第 %d 位\n",j+1);
			i++;
			text=false;
		}
	}

	if(text)//bool类型的输出 
		printf("没有找到");
	return 0;
}

int main()
{
	int a,i=0; 
	char c;
	Sqlist L;//将L定义为Sqlist类型的变量,便于直接引用 
	InitList(L); 
	MyList(L);
	TraverseList(L);
	printf("操作输入序号选择:\n 1:遍历顺序表\n 2:顺序表取值\n 3:删除元素\n 4:插入元素\n 5:顺序表查找\n 6:表长\n输入#退出\n");	
	while(1)
	{
		int f = 0;
		printf("请选择:"); 
		scanf("%c",&c);
		Interrupt();
		switch(c)
		{
			case '1': printf("遍历顺序表: ");TraverseList(L); break;
			case '2': printf("顺序表取值(取值位置): ");GetElem(L, a , a ); break;
			case '3': printf("删除元素(删除的位置): ");DeleteElem(L,a); break;
			case '4': printf("插入元素(位置 插入的元素): ");ListInsert(L,a,a); break;
			case '5': printf("顺序表查找(输入要查找的元素): ");LocateElem(L,a); break;
			case '6': printf("表长: %d \n",L.length); break;
			case '#': f = 1; break;
			default: printf("ERROR\n");
		}
		if (f == 1) 
		{
			printf("已正常退出!\n");
			break;
		}
	}
	
	return 0;
}

(完)


http://www.niftyadmin.cn/n/1580235.html

相关文章

关于 FROM a,b where a.id=b.id和 a LEFT JOIN b on a.id=b.id的区别

关于 FROM a,b where a.idb.id和 a LEFT JOIN b on a.idb.id的区别 两者是等价的, 前者是隐式的内连接. 一般用后者, sql语句看起来清晰一些. 明确队隐含的SQL联接 http://zh-cn.w3support.net/index.php?dbso&id44917 SQL: difference between inner and outer joinhttp:…

链表的创建及相应操作 C语言

数据结构c语言 链表 通过上篇对线性表顺序存储表示的了解&#xff0c;今天进一步对线性表的链式表示进行尝试。本人小白&#xff0c;不喜勿喷。如有错误之处&#xff0c;还请原谅&#xff01; 完整代码如下&#xff1a; #include <stdio.h> #include <stdlib.h>…

Silverli“.NET研究”ght 游戏开发小技巧:传送点特效制作

前面我们使用投影&#xff08;Projection&#xff09;完成了一个升级的特效&#xff0c;Silverlight故事板动画相当的容易&#xff0c;这次我们将详细说说故事板动画的帧制作&#xff0c;完成一个循环的传送点特效&#xff0c;大家都知道&#xff0c;在游戏中&#xff0c;传送点…

循环单链表的创建及基本操作 C语言

数据结构c语言循环单链表 在单链表的基础上增加了循环&#xff0c;和单链表几乎是一样的&#xff0c;只是对链表头结点的定义和对链表结尾的判断&#xff0c;从NULL变成了指向头结点L。别的定义和单链表一样。 代码如下&#xff1a; #include <stdio.h> #include <s…

我眼中的Visual Studio 2010架“.NET研究”构工具

影响架构质量的是构建体系架构的思想、原则、实践与架构师的经验&#xff0c;绝不是工具。即使是最优秀的架构工具&#xff0c;也不可能像倚天宝剑一般——倚天一出&#xff0c;谁与争锋——似乎谁握住了这把利刃&#xff0c;就能够成为武林盟主。架构工具可以改善架构师的工作…

双向循环链表的创建及基本操作

数据结构c语言双向循环链表 双向循环链表在定义上类似于循环单链表&#xff0c;就多了个前指针&#xff0c;以方便于向前查找。在双向链表中需要同时修改两个方向的指针&#xff0c;是单向链表指针的两倍。 完整代码如下&#xff1a; #include <stdio.h> #include <…

集合的合并 C语言实现

数据结构c语言单链表对集合的合并 首先初始化一个链表&#xff0c;并判断是否为空&#xff08;这里就不写了&#xff09; 然后就是对链表的创建&#xff0c;将数据输入到链表中&#xff0c;但是不知道要输入的集合中有多少数据&#xff0c;所以改成直接插入数据&#xff0c;不…

DotNet并行计算“.NET研究”的使用误区

并行计算无疑是.Net Framework平台的一大亮点&#xff0c;它自动的将一个任务分解&#xff0c;并以并发的形式执行&#xff0c;程序员不用操心各任务之间的协作和同步问题&#xff0c;这使得可以更加专注于业务的实现。 .NET 中的 TPL(Task Parallel Library)&#xff0c;中文…