数据结构实验一_线性表、顺序表基本操作的编程实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40833790/article/details/89483499

一、实验题目

线性表、顺序表基本操作的编程实现

二、实验要求

线性表、顺序表基本操作的编程实现,掌握线性表、顺序表的建立、遍历、插入、删除、读取等基本操作的编程实现,也可以进一步编程实现逆序等操作,存储结构可以采用顺序存储结构和链表存储结构之一,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。

三、运行效果图

在这里插入图片描述
在这里插入图片描述

四、程序基本功能

1、添加数据

函数名:adddata()
描述:从键盘上添加数据存入指针结构体中
入口参数:无
出口参数:无
说明:
线性表:定义两个结构体指针,在每次申请一个内存之后,输入数据,然后通过挂链表来添加数据

	printf("请输入实际数据(空格隔开):");
	for(i=0;i<adatanumber;i++)
	{
		newp=(struct link *)malloc(sizeof(struct link));
		scanf("%d",&newp->data);
		lastp->next=newp;
		newp->next=NULL;
		lastp=newp;
		countnumber++;
	}
		printf("添加操作成功!\n\n");
	}

在这里插入图片描述
顺序表:通过循环来往数组中输入数据

	printf("请输入实际数据(空格隔开):");
	for(i=0;i<adatanumber;i++)
	{
		scanf("%d",&dataarray[i]);
		countnumber++;
	}
	printf("添加操作成功!\n\n");

数组的数据显示方式为
在这里插入图片描述

2、显示数据

函数名:showdata()
描述:顺序表和线性表均通过循环来分别输出结点和数组中的数据。
入口参数:无
出口参数:无

3、修改数据

函数名:moddata()
描述:线性表和顺序表均通过countnumber来找到需要修改位置的地址,判断是否存在该信息,如果存在,输入新值直接覆盖原先的值。
入口参数:无
出口参数:无

4、插入数据

函数名:insertdata()
描述:在一串数据之中插入数据
入口参数:无
出口参数:无
说明:
线性表:首先找到需要插入的位置第n个点的地址newp
如果插入点为第一个位置:
(1)headp.next=insertp;(头结点指向插入点)
(2)insert->next=newp;(插入点指向第一个结点)
在这里插入图片描述
如果插入点为任意一个大于1的点:
(1)lastp为n-1个点的位置
(2)lastp->next=insertp;(第n-1个点指向插入点)
(3)insretp->next=newp;(插入点指向第n个点)

在这里插入图片描述
顺序表:首先找到要插入第n个数据的位置,然后从第n个数据开始,把第n个数据赋值给第n+1个,即:
在这里插入图片描述

5、删除数据

函数名:deldata()
描述:删除一串数据之中的某一个
入口参数:无
出口参数:无
说明:
线性表:首先找到需要删除的第n个点的位置newp
如果删除第一个结点:
(1)headp->next=newp->next;(头结点指向第n+1个点)
(2)free(newp);(释放第n个结点)
在这里插入图片描述
如果删除第n个结点:
(1)lastp为第n-1个点
(2)lastp=newp->next;(第n-1个点指向第n+1个点)
(3)free(newp);(释放第n个点)
在这里插入图片描述
顺序表:首先找到要删除那个点的地址,然后从后面开始依次覆盖前一个点
在这里插入图片描述

五、源码

1、线性表基本操作的编程实现

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
void showmenu(void);//菜单显示
void processmenu(void);//菜单控制
void adddata(void);//添加数据
void showdata(void);//显示数据
void moddata(void);//修改数据
void insertdata(void);//插入数据
void deldata(void);//删除数据
void readdata(void);//读取数据
void readlong(void);//读取长度
void invertdata(void);//反转数据
void freelist(void);//清空链表
struct link  //定义链表结构体
{
	int data;
	struct link *next;
};
struct link headp;//定义头结点
int countnumber=0;//次数
int main(void)
{
	system("color f0");//背景白色
	while(1)
	{
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu(void)
{
	puts("===========================");
	puts("  线性表基本操作的编程实现");
	puts("     操作软件:dev c++");
	puts("===========================");
	puts("\t1、添加");
	puts("\t2、显示");
	puts("\t3、修改");
	puts("\t4、插入");
	puts("\t5、删除");
	puts("\t6、读取特定数据");
	puts("\t7、统计数据个数");
	puts("\t8、数据反转");
	puts("\t0、退出程序");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    puts("===========================");
	puts("");
	printf("请输入您的选择:");
}
void processmenu(void)
{
	int menuchoice;//菜单选择  
	scanf("%d",&menuchoice);
	switch(menuchoice)
	{
		case 1:
 			adddata();//添加数据
			break;
		case 2:
			showdata(); //显示数据
			break;
		case 3:
			moddata();//修改数据
			break;
		case 4:
			insertdata();//插入数据
			break;
		case 5:
			deldata();//删除数据
			break;
		case 6:
			readdata();	//读取数据
			break;
		case 7:
			readlong();//读取长度
			break;
		case 8:
			invertdata();//反转数据	
			break;
		case 0:
			freelist();//清空链表
			puts("\n===========================");
			puts("       欢迎下次再用!");
			puts("===========================\n");
			exit(0);
			
		default :
		printf("输入错误!请重新输入...\n");
	}
}
void adddata(void)
{
	int i;
	int adatanumber;
	struct link *newp;
	struct link *lastp;
	headp.next=NULL;
	lastp=&headp;
	if(newp!=NULL)
	countnumber=0;
	printf("请输入数据个数:");
	scanf("%d",&adatanumber);
	if(adatanumber==0)
	printf("没有添加数据!\n\n");	
	else
	{
	printf("请输入实际数据(空格隔开):");
	for(i=0;i<adatanumber;i++)
	{
		newp=(struct link *)malloc(sizeof(struct link));
		scanf("%d",&newp->data);
		lastp->next=newp;
		newp->next=NULL;
		lastp=newp;
		countnumber++;
	}
		printf("添加操作成功!\n\n");
	}
}
void showdata(void)
{
	struct link *newp;
	struct link *lastp;
	newp=headp.next;
	if(newp==NULL)
	printf("没有找到数据信息!\n");
	else
	{
	printf("显示的数据为:");
	while(newp!=NULL)
	{
		printf("%d ",newp->data);
		newp=newp->next;
	}
	}
	printf("\n");
}
void freelist(void)
{
	struct link *newp;
	struct link *lastp;
	newp=headp.next;
	while(newp!=NULL)
	{
		headp.next=newp->next;
		free(newp);
		newp=headp.next;
	}
}
void moddata(void)
{
	struct link *newp;
	struct link *lastp;
	int mdatanumber;
	printf("请输入要修改数据的位置:");
	scanf("%d",&mdatanumber);
	newp=headp.next;
	if(mdatanumber<=0||mdatanumber>countnumber)//判断是否溢出链表
	printf("没有找到该数据信息!\n\n");
	else
	{
	while(mdatanumber>1)
	{
		newp=newp->next;
		mdatanumber--;
	}
	printf("请输入要修改的新数据:");
	scanf("%d",&newp->data);
	printf("修改操作成功!\n\n");
	}
}
void insertdata(void)
{
	struct link *searchp;
	struct link *newp;
	struct link *lastp;
	int idatanumber;
	printf("请输入要插入数据的位置:");
	scanf("%d",&idatanumber);
	newp=headp.next;
	if(idatanumber<=0||idatanumber>countnumber+1)
	printf("插入操作错误!\n\n");
	else
	{
		if(idatanumber==1) //判断将数据插入开头
		{
			searchp=newp;
			printf("请输入要插入的数据:");
			newp=(struct link *)malloc(sizeof(struct link));
			scanf("%d",&newp->data);
			headp.next=newp;
			newp->next=searchp;
			countnumber++;
		}
		else   //插在第n位
		{
		while(idatanumber>1)   //找到这个位置
		{
			lastp=newp;  //把n-1位的地址赋给尾指针
			newp=newp->next;
			idatanumber--;
		}	
		searchp=newp;  //searchp的地址为第n个结点的地址
		printf("请输入要插入的数据:");
		newp=(struct link *)malloc(sizeof(struct link));
		scanf("%d",&newp->data);
		lastp->next=newp;
		newp->next=searchp;
		countnumber++;	//结点数目加1
		}
		printf("插入操作成功!\n\n");
	}
}
void deldata(void)
{
	struct link *newp;
	struct link *lastp;
	int ddatanumber;
	printf("请输入需要删除的位置:");
	scanf("%d",&ddatanumber);
	newp=headp.next;
	if(ddatanumber<=0||ddatanumber>countnumber)
	printf("删除操作错误!\n\n");
	else
	{
		if(ddatanumber==1)
		{
			headp.next=newp->next;
			countnumber--;
			free(newp);
		}
		else
		{
		while(ddatanumber>1)
		{
			lastp=newp;
			newp=newp->next;
			ddatanumber--;
		}
		lastp->next=newp->next;
		countnumber--;
		free(newp);
		}
	printf("删除操作成功!\n\n");
	}
	
}
void readdata(void)
{
	struct link *newp;
	int rdatanumber;
	printf("请输入要读取数据的位置:");
	scanf("%d",&rdatanumber);
	newp=headp.next;
	if(newp==NULL)
	printf("没有找到该数据信息!\n\n");
	else
	{
	if(rdatanumber<0&&rdatanumber>countnumber)
	printf("读取操作错误!\n\n");
	else
	{
		while(rdatanumber>1)
		{
			newp=newp->next;
			rdatanumber--;
		}
		printf("读取的数据为:%d\n",newp->data);
	}
	}
}
void readlong(void)
{
	printf("线性表目前的长度为:%d\n",countnumber);
}
void invertdata(void)
{
	int i;
	int savedata[30];
	struct link *newp;
	struct link *lastp;
	newp=headp.next;
	for(i=1;i<=countnumber;i++)
	{
		savedata[i]=newp->data;
		newp=newp->next;
	}
	lastp=headp.next;
	for(i=countnumber;i>0;i--)
	{
		lastp->data=savedata[i];
		lastp=lastp->next;
	}
	newp=lastp;
	printf("数据反转成功!\n");
}	 	

2、顺序表基本操作的编程实现

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#define len 30
void showmenu(void);//菜单显示
void processmenu(void);//菜单控制
void adddata(void);//添加数据
void showdata(void);//显示数据
void moddata(void);//修改数据
void insertdata(void);//插入数据
void deldata(void);//删除数据
void readdata(void);//读取数据
void readlong(void);//读取长度
void invertdata(void);//反转数据

int dataarray[len];//定义存储数组

int countnumber=0;
int main(void)
{
	system("color f0");//背景白色
	while(1)
	{
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu(void)
{
	puts("===========================");
	puts("  顺序表基本操作的编程实现");
	puts("     操作软件:dev c++");
	puts("===========================");
	puts("\t1、添加");
	puts("\t2、显示");
	puts("\t3、修改");
	puts("\t4、插入");
	puts("\t5、删除");
	puts("\t6、读取特定数据");
	puts("\t7、统计数据个数");
	puts("\t8、数据反转");
	puts("\t0、退出程序");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    puts("===========================");
	puts("");
	printf("请输入您的选择:");
}
void processmenu(void)
{
	int menuchoice;//菜单选择  
	scanf("%d",&menuchoice);
	switch(menuchoice)
	{
		case 1:
 			adddata();//添加数据
			break;
		case 2:
			showdata(); //显示数据
			break;
		case 3:
			moddata();//修改数据
			break;
		case 4:
			insertdata();//插入数据
			break;
		case 5:
			deldata();//删除数据
			break;
		case 6:
			readdata();	//读取数据
			break;
		case 7:
			readlong();//读取长度
			break;
		case 8:
			invertdata();//反转数据	
			break;
		case 0:
			puts("\n===========================");
			puts("       欢迎下次再用!");
			puts("===========================\n");
			exit(0);
			
		default :
		printf("输入错误!请重新输入...\n");
	}
}

void adddata()
{
	int i;
	int adatanumber;
	printf("请输入数据的个数(30以内):");
	scanf("%d",&adatanumber);
	if(dataarray[0]!=NULL)
	countnumber=0;
	printf("请输入实际数据(空格隔开):");
	for(i=0;i<adatanumber;i++)
	{
		scanf("%d",&dataarray[i]);
		countnumber++;
	}
	printf("添加操作成功!\n\n");
}

void showdata()
{
	int i;
	printf("显示的数据为:");
	for(i=0;dataarray[i]!='\0';i++)
	{
		printf("%d ",dataarray[i]);
	}
	printf("\n");
}
void moddata()
{
	int mdatanumber;
	printf("请输入要修改数据的位置:");
	scanf("%d",&mdatanumber);
	printf("请输入要修改的新数据:");
	scanf("%d",&dataarray[mdatanumber-1]);
	printf("修改操作成功!\n");
}
void insertdata()
{
	int i;
	int idatanumber;
	printf("请输入要插入的位置:");
	scanf("%d",&idatanumber);
	printf("请输入要插入的数据:");
	while(countnumber>=idatanumber)
	{
		dataarray[countnumber]=dataarray[countnumber-1];
		countnumber--;
	}
	scanf("%d",&dataarray[idatanumber-1]);
	printf("插入操作成功!\n");
}
void deldata()
{
	int ddatanumber;
	printf("请输入要删除的位置:");
	scanf("%d",&ddatanumber);
	while(ddatanumber<=countnumber)
	{
		dataarray[ddatanumber-1]=dataarray[ddatanumber];
		ddatanumber++;
	}
	countnumber--;
	printf("删除操作成功!\n");
}
void readdata()
{
	int rdatanumber;
	printf("请输入要读取的位置:");
	scanf("%d",&rdatanumber);
	printf("读取的数据为:%d\n",dataarray[rdatanumber-1]);
}
void readlong()
{
	printf("数据的个数为:%d\n",countnumber);
}
void invertdata()
{
	int i,j;
	int exchange;
	j=countnumber/2;
	if(countnumber%2==1)
	i=j;
	else
	i=j-1;
	while(i>=0)
	{
		exchange=dataarray[i];
		dataarray[i]=dataarray[j];
		dataarray[j]=exchange;
		i--;
		j++;	
	}
	printf("数据反转成功!\n");
}

猜你喜欢

转载自blog.csdn.net/qq_40833790/article/details/89483499