线性表实现过程中没遇到什么难点,主要是对指针和结构体的拓展理解,在这记录一下今天快乐的撸码。
/*线性表函数
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;
}