c++数据结构学习笔记-----线性表

        线性表实现过程中没遇到什么难点,主要是对指针和结构体的拓展理解,在这记录一下今天快乐的撸码。

/*线性表函数
initlist创建线性表
destroylist销毁线性表
clearlist清空线性表
listempty检测空表
listlength检测线性表长度
getelem读取某个元素
locateelem查找元素e
priorelem查找pre_e
nextelem查找next_e
listinsertback队尾插入数据e
listinsert在i位置插入e
listdelete在i位置删除e
listtraverse依次打印线性表元素
*/

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<ctime>

#define list_size_first 100 //定义初始分配的存储空间size
#define list_size_add 10 //每次额外申请10地址

struct List{
	int netNum;//元素序号(list长度)
	//int listElem;//元素内容   <---线性表直接用指针存储数据,用地址顺序进行遍历
	int listsize;//分配的地址长度
	int *elem;//指针指向当前节点地址
}list;//节点类设计

//创建线性表(初始化)
void initlist(List *linear)//函数对定义的类进行操作,再带入主函数建立的result名字的List类
{
	linear->elem = (int *)malloc(list_size_first*sizeof(int));//给node指针分配地址
	if(!linear->elem)
		printf("\n   地址分配失败!  \n");
	linear->listsize = list_size_first;
	linear->netNum=0;//目前线性表长度为0
}

int listempty(List *linear)//检测是否为空表,返回一个值NoEmpty-1或者YesEmpty-0
{
	printf("\n IFemptyStart \n");
	if(linear->netNum == 0)
	{
		printf("\n YesEmpty \n\n\n");
		return 0;
	}
	else
	{
		printf("\n NoEmpty \n\n\n");
		return 1;
	}
		
}

void listlength(List *linear )//输出xxx线性表的长度
{
	//printf("\n lengthStart \n");
	printf("\n 该线性表已使用长度为:%d \n",linear->netNum);
	printf("\n 该线性表已分配长度为:%d \n",linear->listsize);
	int leave;
	leave = linear->listsize - linear->netNum;
	//printf("\n 该线性表剩余长度为:%d \n",leave);
	//printf("\n lengthOVER \n\n\n");
}

int leavelength(List *linear)//内置函数,计算剩余地址空间
{
	int leave;
	leave =linear->listsize - linear->netNum;
	return leave;
}



void listtraverse(List *linear)//遍历打印list
{
	for(int i=0;i<linear->netNum;i++)//遍历
	{
		printf(" %d ",linear->elem[i]);//这里使用数组的形式打印?如果打印elem+i会出现数据很大
	}
	printf("\n PrintIsOver ");
}

void listinsertback(List *linear)//尾插
{
	int leavenum = leavelength(linear);
	int data;
	if(leavenum>0)
	{
		printf("\n 请输入最新节点的内容:   \n");
		//scanf("%d",&linear->netNum);//错误赋值手法
		scanf("%d",&data);
		linear->elem[linear->netNum]=data;
		linear->netNum++;
		printf("\n 节点使用完成 \n ");
	}
	else{
		printf("\n 剩余节点不足 \n");
	}
	printf("\n 新list如下: \n ");
	listtraverse(linear);
}

void initlistStatus1(List *linear)//随机初始化
{
	srand(time(0));
	for(int i=0;i<10;i++)//遍历
	{
		linear->elem[i] = rand() %101 ;
		linear->netNum++;
	}
	listtraverse(linear);
	printf("\n randOK");
}

void getelem(List *linear)//获取第i个元素
{
	int nums;
	listlength(linear);
	printf("\n请输入你想查询的元素序号:");
	scanf("%d",&nums);
	printf("\n结果:  %d",linear->elem[nums-1]);
}

void listinsert(List *linear)//位置i更改e
{
	int nums,data;
	listlength(linear);
	printf("\n请输入你想变更的已存在的元素序号:");
	scanf("%d",&nums);
	if(nums<=linear->netNum){
		printf("\n该元素当前内容为:  %d",linear->elem[nums-1]);
		printf("\n您想将内容变更为:");
		scanf("%d",&data);
		linear->elem[nums-1]=data;
		printf("\n 新list如下: \n ");
		listtraverse(linear);
	}
	else
		printf("\n 尚未使用此序号 ");
}

void destroylist(List *linear)//应该是清除长度和地址,让其检测不到
{
	int ans;
	printf("\n 确认要删除已建立的list吗? yes-1 ");
	scanf("%d",&ans);
	if(ans==1)
	{
		linear->netNum = 0;
		printf("\n 已删除 ");
	}
}

int main()
{
	List result;  //使用大名创建一个名叫result结构体,List类型
	initlist(&result);//result初始化
	initlistStatus1(&result);//方便功能检测先随机一些内容
	//listempty(&result);//检测result是否为空
	//listlength(&result);//长度检测
	//listinsertback(&result);//尾插
	//listtraverse(&result);//打印
	//getelem(&result);//查询i位置的元素
	//listinsert(&result);//在i位置更改e
	destroylist(&result);
	//listtraverse(&result);
	system("pause");
	return 0;
}

经过代码更新,添加了操作界面、linear实时显示、随机填充list等功能。(应付作业应该够了)

/*线性表函数
initlist创建线性表
destroylist销毁线性表
clearlist清空线性表
listempty检测空表
listlength检测线性表长度
getelem读取某个元素
locateelem查找元素e
priorelem查找pre_e
nextelem查找next_e
listinsertback队尾插入数据e
listinsert在i位置插入e
listdelete在i位置删除e
listtraverse依次打印线性表元素
*/
 
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<ctime>
 
#define list_size_first 100 //定义初始分配的存储空间size
#define list_size_add 1 //每次额外申请1地址
int leave ; 
int ifempty;

struct List{
	int netNum;//元素序号(list长度)
	//int listElem;//元素内容   <---线性表直接用指针存储数据,用地址顺序进行遍历
	int listsize;//分配的地址长度
	int *elem;//指针指向当前节点地址
}list;//节点类设计
 
//创建线性表(初始化)
void initlist(List *linear)//函数对定义的类进行操作,再带入主函数建立的result名字的List类
{
	linear->elem = (int *)malloc(list_size_first*sizeof(int));//给elem指针分配地址
	if(!linear->elem)
		printf("\n   地址分配失败!  \n");
	linear->listsize = list_size_first;   
	linear->netNum=0;//目前线性表长度为0
}
 
int listempty(List *linear)//检测是否为空表,返回一个值NoEmpty-1或者YesEmpty-0
{
	//printf("\n IFemptyStart \n");
	if(linear->netNum == 0)
	{
		//printf("\n YesEmpty \n\n\n");
		ifempty =  0;
	}
	else
	{
		//printf("\n NoEmpty \n\n\n");
		ifempty = 1;
	}
	return ifempty;
}
 
void listlength(List *linear )//输出xxx线性表的长度
{
	
	printf("\n 该线性表已使用长度为:%d \n",linear->netNum);
	printf("\n 该线性表已分配长度为:%d \n",linear->listsize);
	int leave;
	leave = linear->listsize - linear->netNum;
	//printf("\n 该线性表剩余长度为:%d \n",leave);
	//printf("\n lengthOVER \n\n\n");
}
 
int leavelength(List *linear)//内置函数,计算剩余地址空间
{
	//int leave;
	leave =linear->listsize - linear->netNum;
	return leave;
}

void listtraverse(List *linear)//遍历打印list
{
	listempty(linear);
	if(ifempty==0)printf("\n   空  表  \n");
	else
	{
		for(int i=0;i<linear->netNum;i++)//遍历
		{
			printf(" %d ",linear->elem[i]);//这里使用数组的形式打印?如果打印elem+i会出现数据很大
		}
		printf("\n ");
	}
}
 
void listinsertback(List *linear)//尾插
{
	int leavenum = leavelength(linear);
	int data;
	if(leavenum>0)
	{
		printf("\n 请输入最新节点的内容:   \n");
		//scanf("%d",&linear->netNum);//错误赋值手法
		scanf("%d",&data);
		linear->elem[linear->netNum]=data;
		linear->netNum++;
		printf("\n 尾节点使用完成 \n ");
	}
	else{
		printf("\n 节点不足 \n");
	}
	printf("\n 新list如下: \n ");
	listtraverse(linear);
}

int initlistStatus2(List *linear)//随机初始化10个“0”
{
	srand(time(0));	
	for(int i=0;i<10;i++)//遍历
	{
		linear->elem[i] = 0 ;
     	linear->netNum++;
	}
	return 0;
}
int initlistStatus1(List *linear)//随机功能
{
	int random=0;
	srand(time(0));
	leavelength(linear);
	printf("\n 当前linear的剩余空地址长度为%d ",leave);
	printf("\n 当前linear的长度为%d ",linear->netNum);
	printf("\n 您要随机的元素个数(请勿超过list长度) ");
	scanf("%d",&random);
	if(random<=linear->netNum)	
		for(int i=0;i<random;i++)//遍历
		{
			linear->elem[i] = rand() %10 ;
			printf("\n 已完成内容随机 ");
		}
	else
		printf("\n长度错误");
	return 0;
}

void getelem(List *linear)//获取第i个元素
{
	int nums;
	listlength(linear);
	printf("\n请输入你想查询的元素序号(从1开始):");
	scanf("%d",&nums);
	if(nums<=linear->netNum)
		printf("\n结果:  %d",linear->elem[nums-1]);
	else
		printf("\n节点尚未使用");
}
 
void listinsert(List *linear)//位置i更改e
{
	int nums,data;
	listlength(linear);
	printf("\n请输入你想变更的已存在的元素序号:");
	scanf("%d",&nums);
	if(nums<=linear->netNum){
		printf("\n该元素当前内容为:  %d",linear->elem[nums-1]);
		printf("\n您想将内容变更为:");
		scanf("%d",&data);
		linear->elem[nums-1]=data;
		printf("\n 新list如下: \n ");
		listtraverse(linear);
	}
	else
		printf("\n 尚未使用此序号 ");
}
 
void destroylist(List *linear)//应该是清除长度和地址,让其检测不到
{
	int ans;
	printf("\n 确认要删除已建立的list吗? yes-1 ");
	scanf("%d",&ans);
	if(ans==1)
	{
		linear->netNum = 0;
		printf("\n 已删除 ");
	}
}

void menu()
{
	printf(" -------------------------------------------------------\n");
	printf(" 1     //listtraverse(&result);//打印      \n");
	printf(" 2     //listinsertback(&result);//尾插    \n");
	printf(" 3     //getelem(&result);//查询i位置的元素\n");
	printf(" 4     //listinsert(&result);//在i位置更改e\n");
	printf(" 5     //destroylist(&result);//删除表     \n");
	printf(" 6     //initlistStatus1(&result);//随机内容 \n");
	printf(" 7     //listlength(&result);//输出表长度    \n");
	//printf(" 8     //linear地址+1     \n");
	printf(" 0     //exit                                \n");
	printf(" -------------------------------------------------------  \n");
}

int main()
{
	
	List result;  //创建一个名叫result结构体,List类型
	initlist(&result);//result初始化
	initlistStatus2(&result);//方便功能检测先随机一些内容
	
	int menua = 0;
	int b ;
	while(menua==0)
	{
		menu();
		printf(" -------------------------------------------------------  \nlinear:");
		for(int i=0;i<result.netNum;i++)//遍历
		{
			printf(" %d ",result.elem[i]);//这里使用数组的形式打印?如果打印elem+i会出现数据很大
		}
		printf("\n -------------------------------------------------------  \n");
		printf("\n 输入操作序号:    \n");
		scanf("%d",&b);
		printf("\n 操作%d内容如下\n\t",b);
		switch(b)
		{
			case 1:
				listtraverse(&result);//打印
				break;
			case 2:
				listinsertback(&result);//尾插
				break;
			case 3:
				getelem(&result);//查询i位置的元素
				break;
			case 4:
				listinsert(&result);//在i位置更改e
				break;
			case 5:
				destroylist(&result);//删除
				break;
			case 6:
				initlistStatus1(&result);//方便功能检测先随机一些内容
				break;
			case 7:
				listlength(&result);//输出xxx线性表的长度
				break;
			case 0:
				menua =1 ;
				break;
		}
		system("pause");system("cls");

	}
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值