码迷,mamicode.com
首页 > 其他好文 > 详细

顺序表

时间:2015-12-24 23:54:42      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:

#include <cstdio>
#include <cstring>                        ///都用c语言写的
#include <iostream>                      ///建议从主函数开始看
#include <cstdlib>
using namespace std;
int sequence_map[1000];
int total_sequence = 0;
void init_sequence()                  ///主界面。                          ///一级菜单中顺序表的操作界面  init初始化
{
    printf("*                                *\n");
    printf("*     请输入对应序号进行操作     *\n");
    printf("*         1.顺序表的建立         *\n");
    printf("*         2.顺序表的插入         *\n");
    printf("*         3.顺序表的输出         *\n");
    printf("*         4.顺序表的删除         *\n");
    printf("*         5.顺序表的长度         *\n");
    printf("*         6.退出                 *\n");
    printf("**********************************\n");
    printf("请输入对应序号进行操作:");
}
void establish_sequence()                                           ///建立顺序表
{
    system("cls");
    memset(sequence_map,0,sizeof(sequence_map));                    ///初始化数组为0    memset杂类函数
    printf("请输入顺序表数据组数:");
    int group;
    scanf("%d",&group);                                             ///首先输入数据的组数
    total_sequence=group;
    printf("请分别输入%d组数据,用空格或回车隔开:\n",group);
    for(int i=0; i<group; i++)                                      ///在输入数据的同时进行排序
    {
        int sequence_temp;
        bool flag=false;                                            ///bool变量用来记录数据是否被插入当前数组
        scanf("%d",&sequence_temp);
        for(int j=0; j<i; j++)                                      ///在已经输入的数据中循环找是否有比当前元素大的元素
        {
            if(sequence_temp<sequence_map[j])                       ///如果存在比当前值更大的元素
            {
                ///使bool变量变成true,表示数据被插入数组
                flag=true;
                for(int k=i-1; k>=j; k--)             ///插入排序。              ///把当前顺序表中比这个元素大的元素都后移一位
                    sequence_map[k+1]=sequence_map[k];
                sequence_map[j]=sequence_temp;                      ///将这个元素插入顺序表
                break;
            }
        }
        if(!flag)                                                   ///如果循环没有找到比当前元素大的元素
            sequence_map[i]=sequence_temp;                          ///说明当前元素为最大值,直接加到数组最后一位
    }
    printf("创建顺序表成功!");
    system("pause");
    system("cls");                                                  ///清屏。
    init_sequence();                                                ///返回主界面。
}
void insert_sequence()                                              ///插入数据和建立顺序表原理相同    insert插入
{
    ///可以优化成同一个程序
    system("cls");
    printf("请输入要插入的数据:");
    int insert_temp;                                                 ///insert_temp是要插入的数。
    bool flag=false;
    scanf("%d",&insert_temp);
    for(int i=0; i<total_sequence; i++)
    {
        if(insert_temp<sequence_map[i])                              ///在已经输入的数据中循环找是否有比当前元素大的元素
        {
            flag=true;                                                ///如果存在比当前值更大的元素
            for(int k=total_sequence-1; k>=i; k--)                  ///把当前顺序表中比这个元素大的元素都后移一位;从最后一位开始后移。
                sequence_map[k+1]=sequence_map[k];
            sequence_map[i]=insert_temp;
            break;
        }
    }
    if(!flag)
        sequence_map[total_sequence]=insert_temp;                   ///如果循环没有找到比当前元素大的元素,说明当前元素为最大值,直接加到数组最后一位

    total_sequence++;                                               ///顺序表的元素个数增加1个。
    printf("顺序表插入成功!");
    system("pause");
    system("cls");                                                  ///清屏。
    init_sequence();                                                ///调用主界面。
}
void output_sequence()                                              ///遍历数组,输出所有元素
{
    system("cls");
    printf("顺序表当前为:\n");
    for(int i=0; i<total_sequence; i++)
    {
        printf("%d",sequence_map[i]);
        printf(i==total_sequence-1?"\n":" ");          ///先是一个判断语句,若数sequence_map[i]不是最后一位,就输出空格用以分隔,否则输出换行。
    }
    system("pause");
    system("cls");                                                   ///清屏。
    init_sequence();                                                 ///返回主界面。
}
void delete_sequence()                                              ///删除数据和插入原理相似,需要注意如果存在相同元素需要全部删除
{
    system("cls");
    printf("请输入要删除的数据:");
    int delete_temp;                                                ///delete_temp 是要删除的数据。
    bool flag=false;                                                ///判断顺序表中是否有当前元素
    while(~scanf("%d",&delete_temp))
    {
        for(int i=0; i<total_sequence; i++)                         ///依次检验顺序表中是否存在该数
        {
            if(delete_temp==sequence_map[i])
            {
                total_sequence--;                                   ///如果遇到需要删除的元素,将线性表长度-1
                flag=true;                                          ///表示已经删除该元素
                for(int k=i; k<=total_sequence-1; k++)              ///从这一位开始将后面所有比它大的元素都前移一位
                    sequence_map[k]=sequence_map[k+1];
                i--;                                                ///重点:如果不将i-1,会导致删除完本元素后i向后前进一位
            }                                                       ///数组元素整体向前前进一位,相当于i+=2,如果此时有相同
        }                                                           ///需要删除的元素,会跳过这个元素,导致删除不成功,有兴趣
        if(!flag)                                                   ///可以注释掉i--这一句测试一些数据
        {
            printf("当前顺序表中无此元素,请重新输入:");
            continue;                                               ///如果flag值没有发生变化说明顺序表中没有这个元素
        }
        else
        {
            printf("顺序表元素删除成功!");
            system("pause");
            system("cls");                                           ///清屏。
            init_sequence();                                         ///否则删除成功,重新回到上级菜单
            break;
        }
    }
}
void length_sequence()                                                ///顺序表长度。
{
    system("cls");
    printf("当前顺序表长度为:");
    printf("%d\n",total_sequence);                                   ///由于用了全局变量统计了顺序表的长度,就不用遍历了
    system("pause");
    system("cls");
    init_sequence();
}

void sequence()
{
    system("cls");
    init_sequence();
    int op_sequence;                                        ///二级菜单中线性表的操作选项
    while(~scanf("%d",&op_sequence))
    {
        if(op_sequence==1)
            establish_sequence();
        else if(op_sequence==2)
            insert_sequence();
        else if(op_sequence==3)
            output_sequence();
        else if(op_sequence==4)
            delete_sequence();
        else if(op_sequence==5)
            length_sequence();
        else if(op_sequence==6)
            return;
        else
        {
            printf("输入非法,请重新输入:");
            continue;
        }
    }
}

int main()
{
    init_sequence();
    sequence();
}

 

顺序表

标签:

原文地址:http://www.cnblogs.com/-beyond/p/5074640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!