国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > 数据结构顺序表及链表实验

数据结构顺序表及链表实验

来源:程序员人生   发布时间:2016-09-29 08:18:25 阅读次数:2805次

实验目的

1 、掌握线性表的定义;

2 、掌握线性表的基本操作,如建立、查找、插入和删除等。

实验内容:

定义1个包括学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有以下功能:

(1) 根据指定学生个数,逐一输入学生信息;

(2) 逐一显示学生表中所有学生的相干信息;

(3) 根据姓名进行查找,返回此学生的学号和成绩;

(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);

(5) 给定1个学生信息,插入到表中指定的位置;

(6) 删除指定位置的学生记录;

(7) 统计表中学生个数。

 

参考信息

Definition of structure student

typedef struct {

    char no[8];   //8 位学号

    char name[20]; // 姓名

    int price;     // 成绩

}Student;

 

Definition of sequential list:

typedef  struct {

  Student  *elem;     // 指向数据元素的基地址

  int  length;       // 线性表确当前长度                                                           

 }SqList

         

Definition of linked list

typedef struct LNode{

     Student   data;       // 数据域

     struct LNode  *next;   // 指针域

}LNode,*LinkList;  

 

 

实验要求

(1) 程序要添加适当的注释,程序的书写要采取 缩进格式

(2) 程序要具在1定的 硬朗性,即当输入数据非法时, 程序也能适当地做出反应,如 插入删除时指定的位置不对 等等。

(3) 程序要做到 界面友好,在程序运行时用户可以根据相应的提示信息进行操作。

(4) 根据实验报告模板详细书写实验报告,在实验报告中给出链表 根据姓名进行查找的算法和插入算法的流程图

(5) 上传源程序到Saike网络教学平台。顺序表的源程序保存为 SqList.c ,链表的源程序保存为 LinkList.c


链表实现:

//链表实现 #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; typedef struct { char name[20]; //姓名 char nu[8]; //8位学号 int price; //成绩 } Student; typedef struct LNode { Student data; //数据域 struct LNode *next; //指针域 } LNode,*LinkList; LNode L; LinkList q; void Input() { printf(" 请输入要录入的学生信息(包括姓名(cstring),学号(cstring),成绩(int))个数:"); int num,k=0; LinkList p; scanf("%d",&num); while(num--) { p=(LNode *)malloc(sizeof(LNode)); printf("请输入第%d个学生的信息:",++k); scanf("%s%s%d",p->data.name,p->data.nu,&p->data.price); p->next=NULL; q=&L; while(q->next!=NULL) { q=q->next; // printf("---\n"); } q->next=p; } printf("录入终了\n"); } void Output() { q=L.next; printf("姓名 学号 成绩\n"); while(q->next!=NULL) { printf("%s %s %d\n",q->data.name,q->data.nu,q->data.price); q=q->next; } printf("%s %s %d\n",q->data.name,q->data.nu,q->data.price); } void search() { printf("请输入学生姓名(输入⑴结束查询):"); char c[20]; int flag=0; q=L.next; while(scanf("%s",c)&&c[0]!='-') { flag=0; while(q->next!=NULL) { if(strcmp(c,q->data.name)==0) { printf("姓名:%s 学号:%s 成绩:%d\n",q->data.name,q->data.nu,q->data.price); flag=1; break; } q=q->next; } if(q->next==NULL&&strcmp(c,q->data.name)==0) { printf("姓名:%s 学号:%s 成绩:%d\n",q->data.name,q->data.nu,q->data.price); flag=1; } if(!flag) printf("不存在该学生的信息\n"); printf("请输入学生姓名(输入⑴结束查询):"); } printf("查询结束\n"); } void find() { printf("输入要查找第几个学生的信息:"); int k,step=0,cnt=0; scanf("%d",&k); q=L.next; while(q->next!=NULL) { step++; if(step==k) { printf("姓名:%s 学号:%s 成绩:%d\n",q->data.name,q->data.nu,q->data.price); cnt=1; break; } q=q->next; } if(step==k⑴) { printf("姓名:%s 学号:%s 成绩:%d\n",q->data.name,q->data.nu,q->data.price); cnt=1; } if(!cnt) printf("不存在此学生信息\n"); } void insert() { LinkList p; p=(LNode *)malloc(sizeof(LNode)); printf("请输入要插入的学生信息:"); scanf("%s%s%d",p->data.name,p->data.nu,&p->data.price); int k,step=0,cnt=0; printf("请输入要插入的第几个位置:"); scanf("%d",&k); q=L.next; while(q->next!=NULL) { step++; if(step==k⑴) { cnt=1; break; } q=q->next; } if(step==k⑴) { p->next=q->next; q->next=p; } if(step==k⑵) { p->next=NULL; q->next=p; cnt=1; } if(!cnt) { printf("位置输入过大\n"); } printf("插入终了\n"); } void cutout() { int k,step=0,cnt=0; LinkList p; printf("请输入要删除第几个学生信息:"); scanf("%d",&k); q=L.next; while(q->next!=NULL) { step++; if(step==k⑴) { cnt=1; break; } q=q->next; } if(step==k⑴) { p=q->next; q->next=p->next; free(p); } if(!cnt) printf("位置输入过大\n"); printf("删除终了\n"); } void statistics() { int step=0; q=L.next; while(q->next!=NULL) { step++; q=q->next; } printf("统计表中的学生个数是%d\n",step+1); } void began() { printf("学生成绩管理系统:\n"); printf("********************************************************************************\n"); printf(" 1.输入学生信息\n"); printf(" 2.显示学生表中的学生相干信息\n"); printf(" 3.根据姓名查找学生学号和成绩\n"); printf(" 4.得到指定位置相应的学生信息\n"); printf(" 5.插入学生信息\n"); printf(" 6.删除指定位置的学生记录\n"); printf(" 7.统计表中的学生个数\n"); printf(" 8.安全退出\n\n"); printf("********************************************************************************\n"); printf("请输入要实现的功能编号^.^:"); } int main() { began(); int x; while(scanf("%d",&x)&&x!=8) { switch(x) { case 1: { Input(); break; } case 2: { Output(); break; } case 3: { search(); break; } case 4: { find(); break; } case 5: { insert(); break; } case 6: { cutout(); break; } case 7: { statistics(); break; } } system("pause"); system("cls"); began(); } printf("安全退出\n"); return 0; }

顺序表实现:

#include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #include<cstring> #include<malloc.h> #include<algorithm> using namespace std; const int N = 105; typedef struct { char name[20]; //姓名 char nu[8]; //8位学号 int price; //成绩 } Student; typedef struct { Student *elem; int length; } SqList; SqList L; void build() { L.elem=(Student *)(malloc(sizeof(Student)*N)); //建立线性表 L.length=0; if(!L.elem) printf("建立顺序表失败\n"); } void Input() { //输入 int y,k,p=0; printf("请输入要读入的学生信息(包括姓名(cstring),学号(cstring),成绩(int)) 数目:"); scanf("%d",&y); for(int i=0; i<y; i++) { if(i>=100) { printf("内存超限\n"); return ; } printf("请输入第%d个学生信息:",++p); scanf("%s%s%d",L.elem[i].name,L.elem[i].nu,&L.elem[i].price); L.length++; } printf("建立学生成绩表完成\n"); } void Output() { //输出 printf("姓名 学号 成绩\n"); for(int i=0; i<L.length; i++) { printf("%s %s %d\n",L.elem[i].name,L.elem[i].nu,L.elem[i].price); } //printf("按回车键继续\n"); } void search() { //按姓名查找 printf("输入要查找的学生姓名:"); char tem[20]; scanf("%s",tem); for(int i=0; i<L.length; i++) { if(!strcmp(L.elem[i].name,tem)) { printf("姓名:%s 学号:%s 成绩:%d\n",L.elem[i].name,L.elem[i].nu,L.elem[i].price); return ; } } printf("没有此学生信息\n"); } void find() { //按位置查找 printf("输入要查找第几个学生的信息:"); int temp; scanf("%d",&temp); printf("姓名:%s 学号:%s 成绩:%d\n",L.elem[temp⑴].name,L.elem[temp⑴].nu,L.elem[temp⑴].price); } void insert() { //插入 int num,p=0; Student e; printf("输入你想插入的学生数量:"); scanf("%d",&num); if(L.length+num>=100) { printf("存储不够,插入失败\n"); return ; } while(num--) { int s; printf("输入要插入的第%d个学生的姓名、学号、成绩:",++p); scanf("%s%s%d",e.name,e.nu,&e.price); printf("输入要插入第几个位置:"); scanf("%d",&s); for(int i=L.length; i>s⑴; i--) { L.elem[i]=L.elem[i⑴]; } L.elem[s⑴]=e; L.length++; } printf("插入成功\n"); } void cutout() { //删除 int num; printf("输入共删除几个学生信息:"); scanf("%d",&num); while(num--) { int s; printf("输入删除第几个学生信息:"); scanf("%d",&s); if(s>=L.length) { printf("没有此学生的信息\n"); continue; } for(int i=s⑴; i<L.length⑴; i++) { L.elem[i]=L.elem[i+1]; } L.length--; } printf("删除终了\n"); } void statistics() { //表中的学生信息个数 printf("表中的学生信息个数是:%d\n",L.length); } void began() { printf("学生成绩管理系统:\n"); printf("********************************************************************************\n"); printf(" 1.输入学生信息\n"); printf(" 2.显示学生表中的学生相干信息\n"); printf(" 3.根据姓名查找学生学号和成绩\n"); printf(" 4.得到指定位置相应的学生信息\n"); printf(" 5.插入学生信息\n"); printf(" 6.删除指定位置的学生记录\n"); printf(" 7.统计表中的学生个数\n"); printf(" 8.安全退出\n\n"); printf("********************************************************************************\n"); printf("请输入要实现的功能编号^.^:"); } int main() { began(); build(); int x; while(scanf("%d",&x)&&x!=8) { switch(x) { case 1: { Input(); break; } case 2: { Output(); break; } case 3: { search(); break; } case 4: { find(); break; } case 5: { insert(); break; } case 6: { cutout(); break; } case 7: { statistics(); break; } } system("pause"); system("cls"); began(); } printf("退出成功\n"); return 0; }



生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生