数据结构第一次上机实验报告

一.实验目的:

  1.掌握c++调试线性表的基本操作方法。

  2.掌握顺式与链式线性表的基本操作:插入,删除,查找等等。

  3.如何改进程序的健壮性如何做到界面友好。

二.实验环境

   vscode,g++编译器。

三.上机内容

   定义一个包含学生信息的顺式表和链式表,使其具有如下功能:

  1. 指定学生个数,输入学生信息。
  2. 显示列表中所有学生的学生信息。
  3. 根据名字查询学生学号与成绩。。
  4. 根据列表顺序来查找学生信息。
  5. 给定一个学生信息,插入到表中指定的位置。
  6. 删除指定学生的学生记录。
  7. 统计表中个数。

四.上机调试流程图

链式顺序表中根据姓名查找的算法流程图:

启动程序,然后输入姓名a。在列表中判断有没有name==a,如果有则输出学生信息。没有则输出没有这名学生。

fa478d154c9444ac84157e66295d8555.png

 链式顺序表中插入算法的流程图:

程序开始,输入插入位置a和数据x。先判断插入位置a是否合法,再将第a-1个节点指针域指向x,x的指针域指向原来的第a个节点。

 f9b4f9cb143f465992411b2018004630.png

 五.测试结果

1.启动程序,检测创建列表功能。

按照菜单提示,先输入1。

继续根据提示输入数据 1 a 1

                                   3 c 3

结果创建列表成功。

========开始========
菜单:
创建列表请按1.
输出列表请按2.
插入数据请按3.
删除数据请按4.
姓名查找请按5.
顺序查找请按6.
列表长度请按7.
结束程序请按8.
请选择下一操作:
1
输入学生人数2
输入学号,姓名,成绩1 a 1
输入学号,姓名,成绩3 c 3
创建列表成功!!!
请选择下一操作:

 2.检测插入数据功能。按3选择插入数据功能,插入数据2 b 2到第二个数据单元,在输入2查看线性表。结果如下,成功将数据2 b 2插入到列表第二个数据单元。

3
分别输入插入的位置,学号,姓名与分数:
2 2 b 2
请选择下一操作:
2
1 a 1
2 b 2
3 c 3
请选择下一操作:

3.检测两种查询功能。输入5,按照名字查询学号和成绩。输入6,按照序号查学生信息。结果如下,查询功能都成功运行。 

5
输入待查找的名字:b
学号:2
成绩:2
请选择下一操作:
6
请输入学生序号:
1
学号:1 姓名:a 分数:1
请选择下一操作:

4 检测删除功能。

先输入7查询列表长度,按2查看链表。

然后输入4,删除第二个数据单元,再查看长度与链表。

结果如下,成功删除了第二个数据单元,列表长度减一,查看列表中第二个数据元素被删除。

7
列表的长度:3
请选择下一操作:
2
1 a 1
2 b 2
3 c 3
请选择下一操作:
4
请输入删除的排序1
请选择下一操作:
7
列表的长度:2
请选择下一操作:
2
1 a 1
3 c 3
请选择下一操作:

 最后输入0,程序结束。

六.实验总结

在此次实验中,我学习到了如何改进程序的界面友好性,加强程序的健壮性。查询资料反复调试后,逐步改进了程序,学会了运用c➕➕语言来成功创建了顺式表和链式表,受益匪浅。

七.代码

顺式表代码如下

#include<stdio.h>
#include<iostream>
#include <string.h>
#include <string>
using namespace std;
//数组的最大长度
#define OK 1
#define error 0
#define MAX 10
//OK和error代表函数状态,分别为1(函数成功运行),0(函数出错)
typedef int Status;
//Status是函数类型,其值是函数结果状态代码,如OK代表成功,error代表出错。
//ElemType代表数组类型,根据实际情况确定,这里假设为int型

typedef struct 
{
    char name[20];
    char id[8];
    int score;
}Student;

typedef struct{
    Student *elem;
	int length;
}SqList; 

Status InitList(SqList &L)
{
    L.elem=new Student [MAX];
    L.length=0;
    return OK;
}
Status InputList(SqList &L){
    cout<<"输入学生人数";
    cin>>L.length;
    if (L.length>MAX||L.length<0) exit(error);
    for(int i=0;i<L.length;i++){
        cout<<"输入学号,姓名,成绩";
        cin>>L.elem[i].id>>L.elem[i].name>>L.elem[i].score;
    }
    cout<<"创建列表成功!!!\n";
    return OK;
}
Status OutList(SqList &L){
    for(int i=0;i<L.length;i++){
        cout<<L.elem[i].id<<" "<<L.elem[i].name<<" "<<L.elem[i].score<<endl;
    }
    return OK;
}
Status GetElem(SqList L)
{
    char name[20];
    cout<<"输入待查找的名字:";
    cin>>name;
    int j=0;
    for(int i=0;i<L.length;i++)
    {
        if(strcmp(name,L.elem[i].name)==0)
            {cout<<"学号:"<< L.elem[i].id<<"\n成绩:"<<L.elem[i].score<<endl;}
        else j++;
    }
    if (j==L.length)
        cout<<"没有这个人的名字";
    return 0;
}
Status GetElem_2(SqList L)
{
    cout<<"请输入学生序号:\n";
    int i;
    cin>>i;
    while (i<0||i>L.length) {
        cout<<"请输入合法的学生序号:\n";
        cin>>i;
    }
    i=i-1;
    cout<<"学号:"<<L.elem[i].id<<" 姓名:"<< L.elem[i].name<<" 分数:"<<L.elem[i].score<<endl;
    return OK;
}
Status ListInsert(SqList &L)
{
    int i;
    char name[20];
    char id[8];
    int score;
    cout<<"分别输入插入的位置,学号,姓名与分数:\n";
    cin>>i>>id>>name>>score;
    if (i<0||i>L.length+1) return error;
    if (L.length==MAX) return error;
    for (int j=L.length;j>=i-1;j--)
    {
        L.elem[j+1]=L.elem[j];
    }
    strcpy(L.elem[i-1].name,name);
    strcpy (L.elem[i-1].id,id);
    L.elem[i-1].score=score;
    ++L.length;
    return OK;
}
Status ListDelete(SqList &L)
{
    int i;
    cout<<"请输入删除的排序";
    cin>>i;
    if (i<0||i>L.length)
    {
        return error;
    }
    for (int j=L.length-1;j>i;j--)
    {
        L.elem[j-1]=L.elem[j];
    }
    --L.length;
    return OK;
}
Status ListStastic(SqList &L){
    cout<<"列表的长度:"<< L.length<<endl;
    return 0;
}
int main()
{
    SqList List;
    InitList (List);
    cout<<"========开始========\n";
    cout<<"菜单:\n";
    int a;
    cout<<"创建列表请按1.\n";
    cout<<"输出列表请按2.\n";
    cout<<"插入数据请按3.\n";
    cout<<"删除数据请按4.\n";
    cout<<"姓名查找请按5.\n";
    cout<<"顺序查找请按6.\n";
    cout<<"列表长度请按7.\n";
    cout<<"结束程序请按8.\n";
    while(1)
        {
        cout<<"请选择下一操作:\n";
        
        cin>>a;    
        switch (a)
        {
        case 0:
            cout<<"========结束========";
            return 0;
        case 1:
            InputList(List);
            break;
        case 2:
            OutList(List);
            break;
        case 3:
            ListInsert(List);
            break;
        case 4:
            ListDelete(List);
            break;
        case 5:
            GetElem(List);
            break;
        case 6:
            GetElem_2(List);
            break;
        case 7:
            ListStastic(List);
            break;
        }}
    return 0;
}

链式表代码如下:

#include <iostream>
#include <string>
#include <string.h>
#define OK 0
#define error -1
using namespace std;
typedef int Status;
typedef struct 
{
    char name[8];
    char id[8];
    float score;
}Student;
typedef struct LNode{
    Student data; 
    struct LNode *next;
}LNode,*LinkList;
Status InitList(LinkList &L){
    L=new LNode;
    L->next=NULL;
    return OK;
}
Status InputList(LinkList &L){
    int num;
    cout<<"请输入学生个数:\n";
    cin>>num;
    L=new LNode;
    L->data.score=num;
    L->next=NULL;
    LNode *r=L;
    for (int i=0;i<num;i++){
        cout<<"分别输入学号,姓名,分数:\n";
        LNode *p=new LNode;

        cin>>p->data.id>>p->data.name>>p->data.score;
        p->next=NULL;
        r->next=p;
        r=p;
        }
    return OK;
}
Status OutputList(LinkList &L){
    LNode*p=L->next;
    int a =L->data.score;
    for (int i=0;i<a;i++)
        {cout<<"学号:"<<p->data.id<<" 姓名:"<<p->data.name<<" 成绩:"<<p->data.score<<endl;p=p->next;}
    return OK;
}
Status GetList(LinkList &L){
    char name[20];
    cout<<"请输入查询的姓名\n";
    cin>>name;
    LNode*p=L->next;
    int a=L->data.score;
    int j=0;
    for (int i=0;i<a;i++){
        if (strcmp((p->data).name,name)==0)
           { cout<<"学号为:"<<p->data.id<<"\n分数为:"<<p->data.score<<endl;}
        else j++;
        p=p->next;
    }
    if (j==a)
        cout<<"查无此人";
        return OK; 
}
Status GetList_2(LinkList &L){
    int i;
    cout<<"请输入序号";
    cin>>i;
    if (i<0||i>L->data.score) {
        cout<<"请输入合法的学生序号\n";
        exit (error);
    }
    LNode*p=L->next;
    for (int j=0;j<i-1;j++)
        p=p->next;
    cout<<"学号:"<<p->data.id<<" 姓名:"<< p->data.name<<" 分数:"<<p->data.score<<endl;
    return 0;
}
Status InsertList(LinkList &L){
    int i,j;
    char name[20];
    char id[8];
    int score;
    cout<<"分别输入插入的位置,学号,姓名与分数\n";
    cin>>i>>id>>name>>score;
    LNode*p=L;j=0;
    while((p->next)&&(j<i-1))
        {p=p->next;j++;}
    if (!p||j>i-1) return error;
    LNode *s;
    s=new LNode;
    strcpy(s->data.id,id);
    s->data.score=score;
    strcpy(s->data.name,name);
    s->next=p->next;
    p->next=s;
    L->data.score++;
    return OK;
}
Status DeleteList(LinkList &L){
    cout<<"输入需删除的序号:";
    int i,j;
    cin>>i;
    LNode *p=L;j=0;
    while((p->next)&&(j<i-1))
        {p=p->next;++j;}
    if (!p||j>i+1) return error;
    LNode *q;
    q=p->next;
    p->next=q->next;
    delete q;
    L->data.score--;
    return OK;
}
Status ListStastic(LinkList &L){
    cout<<"长度为:"<<L->data.score<<endl;
    return OK;
}
int main()
{
    LinkList List;
    int a;
    cout<<"请选择一下操作\n";
    cout<<"创建列表请按1.\n";
    cout<<"输出列表请按2.\n";
    cout<<"插入数据请按3.\n";
    cout<<"删除数据请按4.\n";
    cout<<"姓名查找请按5.\n";
    cout<<"顺序查找请按6.\n";
    cout<<"列表长度请按7.\n";
    cout<<"结束程序请按8.\n";
   while(1)
        {
        cout<<"请选择一下操作\n";
        cin>>a;    
        switch (a)
        {
        case 0:
            cout<<"========结束========";
        case 1:
            InputList(List);
            break;
        case 2:
            OutputList(List);
            break;
        case 3:
            InsertList(List);
            break;
        case 4:
            DeleteList(List);
            break;
        case 5:
            GetList(List);
            break;
        case 6:
            GetList_2(List);
            break;
        case 7:
            ListStastic(List);
            break;
        }}
}

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值