大家好,欢迎来到IT知识分享网。
一、实验题目
线性表、顺序表基本操作的编程实现
二、实验要求
线性表、顺序表基本操作的编程实现,掌握线性表、顺序表的建立、遍历、插入、删除、读取等基本操作的编程实现,也可以进一步编程实现逆序等操作,存储结构可以采用顺序存储结构和链表存储结构之一,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。
三、运行效果图
四、程序基本功能
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");
}
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/15137.html