hello~uu们好久不见,这学期我们学习的是数据结构。
快来跟着我的步伐,一起去探索抽象的数据结构吧!
今天我们先从一个简单的线性表系统开始学习!
【例】唐诗
一、实验目的
1、掌握线性表的逻辑结构、存储结构及基本操作;
2、针对计算机领域复杂工程问题,能够综合运用数据结构的基本理论和设计方法,设计出合理的算法。
二、实验内容
唐诗在中国文学史上具有举足轻重的地位,它不仅代表了唐代文学的最高成就,也是中国古代诗歌发展的重要里程碑。唐诗以其独特的艺术魅力和深刻的思想内涵,对后世产生了深远的影响。唐诗以其独特的艺术魅力、深刻的思想内涵和丰富的文化价值,成为了中国文学史上的瑰宝。它不仅代表了唐代文学的最高成就,也为后世文学发展提供了丰富的资源和借鉴。
唐诗的派别主要分为山水田园诗派和边塞诗派。同时,唐诗还具有极高的历史价值和文化价值,是我们了解唐代社会和传承中国传统文化的重要途径之一
请根据所学的知识,对唐诗进行抽象,采用合适的存储结构进行存储,并能够进行相关的操作。
三、算法描述
(自己总结的)
定义结构体变量,用于储存唐诗信息。主函数用switch语句,实现增加插入查找删除等功能。
初始化一个空表,查找时将错误信息定义为负数,若未找到就返回错误信息,
反之,找到后返回存储位置。
删除时检查空表及位置的合法性,将位序i+1及以后的元素向前移动,接着是销毁函数。
插入时在表的第i个元素插入(记得验满和i++)。
四、详细设计
接下来我将用图示解释
五、程序代码
(已给出必要注释)
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAXSIZE 12
#define ERROR -1
typedef struct tangshi ElementType;
typedef struct LNode * List;
struct tangshi{
char shiming[40];
char zuozhe[20];
char neirong[100];
char shiyi[200];
};
struct LNode{
ElementType Data[MAXSIZE];
int Last;
};
//1.函数首部,为下一步的函数实现起指导作用
List MakeEmpty(); //创建空表
int Find(List L,ElementType X); //按值查找
bool Insert(List L,ElementType X,int i); //将X插入到L表的第i位置
bool Delete(List L,int i); //删除L表的第i元素
void Destroy(List L); //销毁表L
void Display(List L); //打印L表
//2、顺序表中的函数实现
List MakeEmpty() //建立一个空顺序表
{
List L;
L=(List)malloc(sizeof(struct LNode));
L->Last=-1;
return L;
}
int Find(List L,ElementType X) //按照值查找
{
int i=0;
while ((i<=L->Last)&&strcmp(L->Data[i].shiming,X.shiming) !=0)
{
i++;
}
if(i>L->Last)
return ERROR;
else
return i+1;
}
bool Insert(List L,ElementType X,int i){
int j;
if(L->Last==MAXSIZE-1){
printf("表已经满了"); //1.判定是否满;
return false;
}
if(i<1||i>L->Last+2)
{
printf("不合法"); //2.判定位序是否合法;
return false;
}
for(j=L->Last;j>=i-1;j--) //3.移动;4.插入;5.表长加1
{
L->Data[j+1]=L->Data[j];
}
L->Data[i-1]=X;
L->Last++;
return true;
}
//删除 注意:位序为i的元素 ,下标是i-1位置的元素 ,合法的位序为1<=i<=L->Last+1
bool Delete(List L,int i)
{
if(L->Last==-1)
{ //1.判定是否为空;
printf("表空");
return false;
}
if(i<1||i>L->Last+1)
{
printf("不合法"); //2.判定位序是否合法;
return false;
}
for(int j=i;j<=L->Last;j++){ //3.通过移动数据直接删除;4.表长减去1
L->Data[j-1]=L->Data[j];
}
L->Last--;
return true;
}
//销毁
void Destroy(List L){
if(L)
free(L);
}
//数据显示
void Display(List L){
for(int i=0;i<=L->Last;i++){
printf("%d-%s-%s\n",L->Data[i].shiming,L->Data[i].zuozhe,L->Data[i].neirong,L->Data[i].shiyi);
}
printf("\n");
}
int main(void)
{
int i;
List L=MakeEmpty();
ElementType Data;
int choice;
while(1){
printf("\n\t唐诗管理系统\n1.增加新诗\n2.插入\n3.查找\n4.删除\n5.输出\n6.退出\n");
printf("您的选择:");
scanf("%d",&choice);
if(choice==6)
break;
switch(choice)
{
case 1:
printf("请输入诗的诗名:");
scanf("%s",&Data.shiming);
printf("请输入诗的作者:");
scanf("%s",&Data.zuozhe);
printf("请输入诗的内容;");
scanf("%s",&Data.neirong);
Insert(L,Data,L->Last+2);
Display(L);
break;
case 2:
printf("请输入插入的位置:");
scanf("%d",&i);
printf("请输入诗的诗名:");
scanf("%s",&Data.shiming);
printf("请输入诗的作者:");
scanf("%s",&Data.zuozhe);
printf("请输入诗的内容;")
scanf("%s",&Data.neirong);
Insert(L,Data,i);
Display(L);
break;
case 3:
printf("请输入要查找的诗名:");
ElementType NewData;
scanf("%s",NewData.shiming);
printf("%d\n",Find(L,NewData));
break;
case 4:
printf("请输入要删除的元素的位置");
scanf("%d",&i);
Delete(L,i);
Display(L);
break;
case 5:
Display(L);
}
}
Destroy(L);
return 0;
}
六、测试
这个部分同学们可以在自己的dev c++或者vs上进行调试
根据字幕的提示,依次实行你想要进行的功能。
同学们快来试试吧!