数据结构——创建顺序表

一、实验目的

1、熟练掌握线性表的结构特点,掌握顺序表的基本操作。
2、巩固 C++相关的程序设计方法与技术。
3、学会使用顺序表解决实际问题。
二、实验内容

1、顺序表的建立与操作实现
建立n个元素的顺序表(n 的大小和表里数据自己确定),实现相关的操作:输出,插入,删除,查找等功能。编写完整程序实现,程序语言不限定,使用技术形式不定。
三、实验步骤

主程序

Created with Raphaël 2.1.0 开始 添加结点 顺序表是否满? 显示所有结点 功能 结束 是否继续添加 yes no yes no

功能:
1. 添加结点
2. 显示结点
3. 插入结点
4. 查找结点
5. 删除结点

四、实现代码
1、类定义

struct Xinxi//struct数据表要用的结构
{
    string StudentID;//学号.字符串类型
    string name;//名字
    int age;//年龄
};
struct SLType //顺序表结构
{
    Xinxi LisXinxi[LEN + 1];//保存顺序表的结构 数组
    int ListLen;//保存点数量
};

2、顺序表的功能

①初始化顺序表

void SLRe(SLType *SL)////初始化顺序表,定义结构体指针 SL
{
    SL->ListLen = 0;//初始化结点数量
}

②结点数量

int SLLenght(SLType *SL)
{
    return(SL->ListLen);//返回结点数量
}

③添加结点

int SLAdd(SLType *SL, Xinxi xinxi)//添加结点
{
    if (SL->ListLen >= LEN)//若超过最大长度
    {
        cout << "顺序表已满,添加失败" << endl;
        return 0;//不再返回值
    }
    SL->LisXinxi[++SL->ListLen] = xinxi;//从1开始添加,每次添加都加1
    return 1;
}

④插入结点

int SLInsert(SLType *SL, int n, Xinxi xinxi)//插入结点
{
    int i;
    if (SL->ListLen >= LEN)//若超过最大长度
    {
        cout << "顺序表已满,添加失败" << endl;
        return 0;//不再返回值
    }
    if (n<1 || n>SL->ListLen)//插入结点的序号要大于0小于最大长度
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    for (i = SL->ListLen; i >= n; i--)
    {
        SL->LisXinxi[i + 1] = SL->LisXinxi[i];//将顺序表中的数据向后移动
    }
    SL->LisXinxi[n] = xinxi;
    SL->ListLen++;////顺序表结点数量+1
    return 1;
}

⑤删除结点

int SLDelete(SLType *SL, int n)//删除结点
{
    int i;
    if (n<1 || n>SL->ListLen)//判断
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    for (i = n; i < SL->ListLen; i++)
    {
        SL->LisXinxi[i] = SL->LisXinxi[i + 1];//将数据表数据向前移
    }
    SL->ListLen--;///顺序表结点数量-1
    return 1;
}

⑥查找结点

Xinxi * SLFind(SLType *SL, int n)//根据序号查找结点
{
    if (n<1 || n>SL->ListLen)
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    return &(SL->LisXinxi[n]);//指针返值
}

⑦ 显示所有结点

void SLAll(SLType *SL)//显示所有结点
{
    int i;
    for (i = 1; i <= SL->ListLen; i++)
    {
        cout << "学号:" << SL->LisXinxi[i].StudentID << ",名字:" << SL->LisXinxi[i].name << ",age:" << SL->LisXinxi[i].age << endl;
    }//循环逐个显示
}

3、主函数

int main()
{
    int i;
    int b;
    SLType SL;
    Xinxi xinxi;
    Xinxi *pxinxi;
    string name;
    cout << "*********顺序表*********\n" << endl;
    SLRe(&SL);//初始化
    do//添加结点
    {
        cout << "学号 姓名 年龄 :";
        cin >> xinxi.StudentID >> xinxi.name >> xinxi.age;//输入数据
        cout << "按1继续添加,0退出 : ";
        cin >> b;
        if (!b)
        {
            break;
        }
        if (xinxi.age)// 年龄不为0
        {
            if (!SLAdd(&SL, xinxi))//结点满了
            {
                break; //退出循环
            }
        }
        else
        {
            break;
        }
    } while (1);
    cout << "顺序表中的结点为: " << endl;
    SLAll(&SL); //显示结点
    cout << "请输入要查找的结点序号:";
    cin >> i;
    pxinxi = SLFind(&SL, i);
    if (pxinxi)
    {
        cout << "第" << i << "个结点为:学号" << pxinxi->StudentID << ",名字" << pxinxi->name << ",年龄" << pxinxi->age << endl;
    }
    cout << "请输入您要删除的结点的序号:";
    cin >> i;
    if (SLDelete(&SL, i))
    {
        cout << "数据删除成功" << endl;
        SLAll(&SL);
    }
    return 0;
}

因为时间关系(其实是偷懒,我就没有把数据插入的功能写进主函数里了)

完整代码

#include 
#include
#include
using namespace std; //使用标准库,防重复
#define LEN 10 //顺序表长度
                     /********类定义*******/
struct Xinxi//struct数据表要用的结构
{
    string StudentID;//学号.字符串类型
    string name;//名字
    int age;//年龄
};
struct SLType //顺序表结构
{
    Xinxi LisXinxi[LEN + 1];//保存顺序表的结构 数组
    int ListLen;//保存点数量
};
/**********顺序表功能***************/
void SLRe(SLType *SL)////初始化顺序表,定义结构体指针 SL
{
    SL->ListLen = 0;//初始化结点数量
}
int SLLenght(SLType *SL)
{
    return(SL->ListLen);//返回结点数量
}
int SLAdd(SLType *SL, Xinxi xinxi)//添加结点
{
    if (SL->ListLen >= LEN)//若超过最大长度
    {
        cout << "顺序表已满,添加失败" << endl;
        return 0;//不再返回值
    }
    SL->LisXinxi[++SL->ListLen] = xinxi;//从1开始添加,每次添加都加1
    return 1;
}
int SLInsert(SLType *SL, int n, Xinxi xinxi)//插入结点
{
    int i;
    if (SL->ListLen >= LEN)//若超过最大长度
    {
        cout << "顺序表已满,添加失败" << endl;
        return 0;//不再返回值
    }
    if (n<1 || n>SL->ListLen)//插入结点的序号要大于0小于最大长度
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    for (i = SL->ListLen; i >= n; i--)
    {
        SL->LisXinxi[i + 1] = SL->LisXinxi[i];//将顺序表中的数据向后移动
    }
    SL->LisXinxi[n] = xinxi;
    SL->ListLen++;////顺序表结点数量+1
    return 1;
}
int SLDelete(SLType *SL, int n)//删除结点
{
    int i;
    if (n<1 || n>SL->ListLen)//判断
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    for (i = n; i < SL->ListLen; i++)
    {
        SL->LisXinxi[i] = SL->LisXinxi[i + 1];//将数据表数据向前移
    }
    SL->ListLen--;///顺序表结点数量-1
    return 1;
}
Xinxi * SLFind(SLType *SL, int n)//根据序号查找结点
{
    if (n<1 || n>SL->ListLen)
    {
        cout << "序号输入错误" << endl;
        return 0;
    }
    return &(SL->LisXinxi[n]);//指针返值
}
void SLAll(SLType *SL)//显示所有结点
{
    int i;
    for (i = 1; i <= SL->ListLen; i++)
    {
        cout << "学号:" << SL->LisXinxi[i].StudentID << ",名字:" << SL->LisXinxi[i].name << ",age:" << SL->LisXinxi[i].age << endl;
    }//循环逐个显示
}
/*******主函数********/
int main()
{
    int i;
    int b;
    SLType SL;
    Xinxi xinxi;
    Xinxi *pxinxi;
    string name;
    cout << "*********顺序表*********\n" << endl;
    SLRe(&SL);//初始化
    do//添加结点
    {
        cout << "学号 姓名 年龄 :";
        cin >> xinxi.StudentID >> xinxi.name >> xinxi.age;//输入数据
        cout << "按1继续添加,0退出 : ";
        cin >> b;
        if (!b)
        {
            break;
        }
        if (xinxi.age)// 年龄不为0
        {
            if (!SLAdd(&SL, xinxi))//结点满了
            {
                break; //退出循环
            }
        }
        else
        {
            break;
        }
    } while (1);
    cout << "顺序表中的结点为: " << endl;
    SLAll(&SL); //显示结点
    cout << "请输入要取出的结点序号:";
    cin >> i;
    pxinxi = SLFind(&SL, i);
    if (pxinxi)
    {
        cout << "第" << i << "个结点为:学号" << pxinxi->StudentID << ",名字" << pxinxi->name << ",年龄" << pxinxi->age << endl;
    }
    cout << "请输入您要删除的结点的序号:";
    cin >> i;
    if (SLDelete(&SL, i))
    {
        cout << "数据删除成功" << endl;
        SLAll(&SL);
    }
    return 0;
}

本来没想到用指针来实现大部分功能的,不过因为数据表适合用指针来做,而且看到很多人都是用指针来写所以也就借鉴了,本来对指针很陌生的我写完这个程序后熟悉了很多。写得不算太好,有点偷工减料(没有列成一个选项来让人选)。

你可能感兴趣的:(数据结构——创建顺序表)