数据结构之有序表的实现(c语言)

有序表的建立、插入与删除

一、目的

1 了解有序表的顺序存储结构。
2 掌握有序表元素在内存中是怎样存储的。
3 在有序表中实现如下操作:
(1)插入一个新元素到第i个位置,使原来标号为增1;
(2)删除第i个位置的元素;
(3)存一个新元素到第i个位置;
(4)读表;
(5)检索表中第i个元素;
(6)寻表的长度。

二、原理

线性表是最常用的而且也是最简单的一种数据结构,线性表是N个数据元素的有限序列。例如26个英文元素的字母表:(A,B,C,D…)。其数据结构的描述为:Linear_list=(D,R)其中:D={ai|ai属于D0,i=1,2,3,···}R={N},N={|i=2,3,4,···}。本实验是以数组的形式把有序表存放在计算机内存的一个连续的区域内,这样便有:LOC(ai+1)=LOC(ai)+m。其中m是存放每个元素所占的内存字数。LOC(ai)=LO+m·(i-1)。其中LO是ai的地址,即首地址。
实验程序说明:
插入一个新元素到第i个位置,既把元素ai向后移一个位置,成为元素ai+1,把新元素放入到第i个位置,其他元素依次后移。
存一新元素到第i个位置是把元素ai冲掉后存上新值。
删除第i个元素就是把余后的元素依次向前移一个位置。即:以元素ai+1,ai+2,……,依次取代ai,ai+1……。删除后的表长是n-1(n是原表长)。

三、程序流程图

数据结构之有序表的实现(c语言)_第1张图片

四、程序示例

#include
#include
#define maxn 100

int a[maxn];
int array_Length; //用户所定义的线性表长度
int op; //定义操作数
int p; //操作位置
bool is_OK=false;
bool is_Flag=true; //主循环结束标志

void show_Welcome(); //欢迎语句
void init_Array(); //初始化线性表
void show_Menu(); //功能菜单
void insert(); //线性表插入操作
void _delete(); //线性表删除操作
void get_NewNumber(); //线性表读新值操作
void show(); //打印表中元素
void search(); //检索表中元素
void get_ListLength(); //获取表长
void pause(); //用于程序暂停,便于查看输出结果
bool is_Check(int length); //检查是否超出表长

int main()
{
    show_Welcome();
    init_Array();
    while(is_Flag)
    {
        show_Menu();
        scanf("%d",&op);
        switch (op) {
            case 1: insert(); break;
            case 2: _delete(); break;
            case 3: get_NewNumber(); break;
            case 4: show(); break;
            case 5: search(); break;
            case 6: get_ListLength(); break;
            case 0: is_Flag=false; break;
        }
    }
    return 0;
}

void show_Welcome()
{
    printf("-------欢迎使用本程序-------\n");
}

void init_Array()
{
    printf("请输入您所要线性表的长度:\n");
    scanf("%d",&array_Length);
    printf("请依次输入线性表的元素:\n");
    for(int i=1;i<=array_Length;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("-------顺序表初始化完成-------\n");
}

void show_Menu()
{
    printf("以下是菜单内容:\n");
    printf("插入操作----------按键1\n");
    printf("删除操作----------按键2\n");
    printf("读新值操作--------按键3\n");
    printf("打印表中所有元素---按键4\n");
    printf("按序列号查找表中元素-按键5\n");
    printf("显示表长----------按键6\n");
    printf("退出-------------按键0\n");
    printf("请输入您要进行的操作按键:\n");
}

void insert()
{
    int number;
    while(1)
    {
        printf("请输入您要插入的位置\n");
        scanf("%d",&p);
        is_OK=is_Check(p);
        if(is_OK)
            break;
    }
    printf("请输入要插入的元素:\n");
    scanf("%d",&number);
    for(int i=array_Length;i>=p;i--)
    {
        a[i+1]=a[i];
    }
    a[p]=number;
    array_Length++;
    printf("-------插入成功!-------\n");
    pause();
}

bool is_Check(int length)
{
    if(length>array_Length || length<0)
    {
        printf("-------您所输入的位置不合法,请重新输入-------\n");
        return false;
    }
    else
    {
        return true;
    }
}

void _delete()
{
    while(1)
    {
        printf("请输入您要删除的位置\n");
        scanf("%d",&p);
        is_OK=is_Check(p);
        if(is_OK)
            break;
    }
    for(int i=p;i<p;i++)
    {
        a[i]=a[i+1];
    }
    array_Length--;
    printf("-------删除成功!-------\n");
    pause();
}

void get_NewNumber()
{
    int number;
    while(1)
    {
        printf("请输入新元素的位置\n");
        scanf("%d",&p);
        is_OK=is_Check(p);
        if(is_OK)
            break;
    }
    printf("请输入新的元素:\n");
    scanf("%d",&number);
    a[p]=number;
    printf("-------覆盖成功!-------\n");
    pause();
}

void show()
{
    printf("表中元素为:");
    for(int i=1;i<=array_Length;i++)
    {
        printf("%4d",a[i]);
    }
    printf("\n");
    pause();
}

void search()
{
    while(1)
    {
        printf("请输入您要检索的位置\n");
        scanf("%d",&p);
        is_OK=is_Check(p);
        if(is_OK)
            break;
    }
    printf("第%d个元素为: %d\n",p,a[p]);
    pause();
}

void get_ListLength()
{
    printf("线性表的表长为:%d\n",array_Length);
    pause();
}

void pause()
{
    printf("-------请按回车键继续-------\n");
    getchar();getchar();
}

你可能感兴趣的:(数据结构与算法)