【数据结构】顺序表的实现(C语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN___CSDN/article/details/82630771

学习顺序表要掌握以下操作。

1、顺序表的初始化——置空表。

2、在顺序表后部插入值为x的节点。

3、打印顺序表的个节点值。

4、判断顺序表是否为空。

5、查找顺序表中值为x的节点位置。

6、取得顺序表中第i个节点的值。

7、在顺序表的position位置插入值为x的节点位置。

8、删除表中第position位置的节点。

运行环境:code::blocks 17.12

下面是头文件

#ifndef SEQULIST_H_INCLUDED
#define SEQULIST_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct
{
    datatype a[MAXSIZE];
    int size_;
}sequence_list;

//置空表
void init(sequence_list *slt)
{
    slt->size_=0;
}

//在顺序表后面进行插入
void append(sequence_list *slt,int x)
{
    if (slt->size_==MAXSIZE)
    {
        printf("顺序表已满!");
        exit(1);
    }
    slt->a[slt->size_]=x;
    slt->size_=slt->size_+1;
}

//打印顺序表的各节点值
void display(sequence_list *slt)
{

    int i;
    if (!slt->size_)
    {
        printf("顺序表是空的!");
    }
    else
    {
        for (i=0;i<slt->size_;i++)
        {
            printf("%d",slt->a[i]);
            if (i!=slt->size_-1)
            {
                printf(" -> ");
            }
        }
    }
}

//判断顺序表是否为空
int isempty(sequence_list *slt)
{
    return (slt->size_==0?1:0);
    //是空的话返回1,不是返回0
}

//查找顺序表中值为x的结点位置
int find_(sequence_list *slt,int x)
{
    int i=0;
    while(i<slt->size_ && slt->a[i]!=x)
    {
        i++;
    }
    return (i<slt->size_?i:-1);
}

//取出顺序表中第i个节点的值
void get(sequence_list *slt,int i)
{
    printf("第%d个节点的值为:%d\n\n",i,slt->a[i-1]);
}

//顺序表的插入操作
void insert_(sequence_list *slt,datatype x,int position)
{
    int i;
    if (slt->size_==MAXSIZE)
    {
        printf("顺序表是满的没法插入!");
        exit(1);
    }
    if (position<0 || position>slt->size_)
    {
        printf("插入的指定位置不存在!");exit(1);
    }
    for (i=slt->size_;i>position;i--)
    {
        slt->a[i]=slt->a[i-1];
    }
    slt->a[position]=x;
    slt->size_++;
}

//顺序表的删除第position位置上的节点
void delete_(sequence_list *slt,int position )
{
    int i;
    if (!slt->size_)
    {
        printf("\n顺序表是空的!");
        exit(1);
    }
    if (position<0 || position >= slt->size_)
    {
        printf("指定的删除位置不存在!");
        exit(1);
    }
    for (i=position;i<slt->size_-1;i++)
    {
        slt->a[i]=slt->a[i+1];
    }
    slt->size_--;
}

void menu()
{
    printf("\t|===================================|\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|          顺序表的相关操作         |\t\n");
    printf("\t|                                   |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|有如下选项:                        |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|【1】置空表                        |\t\n");
    printf("\t|【2】在顺序表的后部进行插入操作    |\t\n");
    printf("\t|【3】打印顺序表的各节点位置        |\t\n");
    printf("\t|【4】判断顺序表是否为空            |\t\n");
    printf("\t|【5】查找顺序表中值为x的位置节点   |\t\n");
    printf("\t|【6】取得顺序表中第i个节点的值     |\t\n");
    printf("\t|【7】顺序表的插入操作              |\t\n");
    printf("\t|【8】顺序表的删除操作              |\t\n");
    printf("\t|===================================|\t\n");
    printf("\t|Ctrl+C结束该程序!!!             |\t\n");
    printf("\t|===================================|\t\n");
}
#endif // SEQULIST_H_INCLUDED

下面是程序

#include "sequlist.h"
#include "stdio.h"
int main ()
{
    int i,k,a,count=0;
    sequence_list slt;
    while(1)
    {
        menu();
        if(count==0)
        {
            printf("\n\n请输入你的选择:");count=1;
        }
        else
        {
            printf("\n\n请再次输入你的选择:");
        }
        scanf("%d",&i);
        switch (i)
        {
            case 1:
            {
                init(&slt);
                printf("成功构造一个线性表。\n\n");
                break;
            }
            case 2:
            {
                printf("请输入一个数字,它将添加到顺序表的末尾:");
                scanf("%d",&a);
                append(&slt,a);
                printf("\n成功在末尾添加进一个数据。\n\n");break;
            }
            case 3:
            {
                display(&slt);
                printf("\n成功打印顺序表各节点的值。\n\n");break;
            }
            case 4:
            {
                if(isempty(&slt))   printf("该顺序表为空表。");
                else printf("该顺序表不是空表。");
                printf("已进行判断。\n\n");break;
            }
            case 5:
            {
                printf("请输入一个数字(可能存在于顺序表中):");
                scanf("%d",&a);
                if(find_(&slt,a)==-1)
                {
                    printf("该数不存在于当前所创建的线性表中。");
                }
                else
                {
                    printf("该数在顺序表中的位置是:%d\n",find_(&slt,a));
                }
                printf("已运行成功。\n\n");break;
            }
            case 6:
            {

                printf("请输入节点的序号,当前一共有%d个节点\n",slt.size_);
                scanf("%d",&a);
                get(&slt,a);
                break;
            }
            case 7:
            {
                printf("当前顺序表为:");
                display(&slt);
                printf("\n请输入插入的数值:");
                scanf("%d",&a);
                printf("请输入插入的位置:");
                scanf("%d",&k);
                insert_(&slt,a,k);
                printf("已运行成功。\n\n");
            }
            case 8:
            {
                printf("当前顺序表为:");
                display(&slt);
                printf("\n请输入想要删除的节点的序号,当前一共有%d个节点\n",slt.size_);
                scanf("%d",&a);
                delete_(&slt,a);
                printf("已运行成功。\n\n");
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/82630771