数据结构——创建顺序表

一、实验目的

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 <stdio.h>
#include<iostream>
#include<string>
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;
}

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

  • 48
    点赞
  • 227
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是用Java顺序表实现简易通讯录的代码: 首先,在Java中需要定义一个类来表示通讯录中的每一个联系人,这个类包含联系人的姓名和电话号码两个属性: ```java public class Contact { private String name; private String phoneNumber; public Contact(String name, String phoneNumber) { this.name = name; this.phoneNumber = phoneNumber; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } } ``` 接下来,我们用一个顺序表来存储所有的联系人信息: ```java public class ContactList { private Contact[] contacts; private int size; public ContactList(int capacity) { contacts = new Contact[capacity]; size = 0; } public boolean add(Contact contact) { if (size >= contacts.length) { return false; } contacts[size++] = contact; return true; } public boolean remove(int index) { if (index < 0 || index >= size) { return false; } for (int i = index; i < size - 1; i++) { contacts[i] = contacts[i + 1]; } contacts[--size] = null; return true; } public Contact get(int index) { if (index < 0 || index >= size) { return null; } return contacts[index]; } public int size() { return size; } } ``` 在这个类中,我们定义了一个Contact类型的数组来存储所有的联系人信息,同时还有一个size变量来记录当前已经存储的联系人数目。在这个类中,我们提供了以下几个方法: - add(Contact contact):向通讯录中添加一个联系人,如果当前已经存储的联系人数目已经达到了数组的容量,则添加失败。 - remove(int index):根据给定的下标从通讯录中删除一个联系人,如果给定的下标越界,则删除失败。 - get(int index):根据给定的下标获取通讯录中指定位置的联系人,如果给定的下标越界,则返回null。 - size():获取当前通讯录中已经存储的联系人数目。 我们可以使用这个类来实现一个简单的通讯录应用程序,这个程序可以让用户输入联系人的姓名和电话号码,然后将其添加到通讯录中,也可以让用户删除指定位置的联系人,还可以列出所有已经存储的联系人信息。下面是这个应用程序的代码: ```java import java.util.Scanner; public class ContactApp { public static void main(String[] args) { ContactList contactList = new ContactList(10); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请选择操作:"); System.out.println("1. 添加联系人"); System.out.println("2. 删除联系人"); System.out.println("3. 列出所有联系人"); System.out.println("4. 退出"); int choice = scanner.nextInt(); scanner.nextLine(); switch (choice) { case 1: System.out.println("请输入联系人姓名:"); String name = scanner.nextLine(); System.out.println("请输入联系人电话号码:"); String phoneNumber = scanner.nextLine(); Contact contact = new Contact(name, phoneNumber); if (contactList.add(contact)) { System.out.println("添加成功!"); } else { System.out.println("添加失败,通讯录已满!"); } break; case 2: System.out.println("请输入要删除联系人的下标:"); int index = scanner.nextInt(); if (contactList.remove(index)) { System.out.println("删除成功!"); } else { System.out.println("删除失败,下标越界!"); } break; case 3: System.out.println("所有联系人信息:"); for (int i = 0; i < contactList.size(); i++) { Contact c = contactList.get(i); System.out.println((i + 1) + ". " + c.getName() + " " + c.getPhoneNumber()); } break; case 4: System.out.println("谢谢使用!"); return; default: System.out.println("输入错误,请重新输入!"); break; } } } } ``` 这个应用程序首先创建了一个ContactList对象来存储所有的联系人信息。然后,它通过一个无限循环来等待用户输入选择,并根据用户的选择执行相应的操作。当用户选择退出程序时,程序会结束。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值