数据结构线性表之顺序表的基本操作及菜单应用(C程序实现)

//参考书是机械工业出版社的数据结构与算法分析(C语言描述);

//本程序是可移植性程序;

//能在Linux/Mac os/Windows下编译运行;

//若有不足之处请提出,博主会尽所能修改;

//若是对您有用的话请点赞收藏或分享给它人;

//未经允许严禁抄袭以及转载;

//源代码奉上,希望能够对您有所启发;

//----------------------------------------------------------------------------
//main.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "arraylist.h"

int show_menu(void);                  //显示主菜单;
int get_first(void);                  //获取用户输入的第1个字符;
void eatline(void);                   //清空输入缓冲区;
elemtype input(elemtype *ch);         //获取用户输入的数据元素;
int input_pos(int *tp);               //获取用户输入的操作位置;
void choice(int ch, arraylist *parr); //操作顺序表中的数据元素;

int main(void)
{
    
    
    int ch;
    arraylist arr;

    init_list(&arr); //为顺序表分配存储空间;
    while ((ch = show_menu()) != 'q')
    {
    
    
        choice(ch, &arr);
    }
    destroy_list(&arr);
    puts("本程序完成!");

    return 0;
}

int show_menu(void)
{
    
    
    int ch;

    puts("========================================");
    puts("a) 判断顺序表是否为空");
    puts("b) 查看顺序表长度和当前元素个数");
    puts("c) 获取指定位置的数据");
    puts("d) 查找数据是否存在");
    puts("e) 在指定位置添加新的数据元素");
    puts("f) 删除指定位置的数据元素");
    puts("g) 遍历顺序表");
    puts("q) 退出本程序");
    puts("========================================");
    printf("请您输入选择:");
    ch = get_first();
    while (strchr("abcdefgq", ch) == NULL)
    {
    
    
        printf("您的输入无效!请重新输入:");
        ch = get_first();
    }
    return ch;
}

int get_first(void)
{
    
    
    int ch;

    do
    {
    
    
        ch = tolower(getchar());
    } while (isspace(ch));
    eatline();

    return ch;
}

void eatline(void)
{
    
    
    while (getchar() != '\n')
        continue;
    return;
}

elemtype input(elemtype *ch) //输入用户所需要的数据,随着数据类型的不同可以动态修改此函数的内容;
{
    
    
    printf("请您输入一个数据元素(整型元素):");
    while (scanf("%d", ch) != 1)
    {
    
    
        eatline();
        printf("数据无效!请重新输入:");
    }
    eatline();
    return *ch;
}

int input_pos(int *tp)
{
    
    
    printf("请您输入一个需要操作的位置:");
    while (scanf("%d", tp) != 1)
    {
    
    
        eatline();
        printf("数据无效!请重新输入:");
    }
    eatline();
    return *tp;
}

void choice(int ch, arraylist *parr)
{
    
    
    int pos;
    elemtype val;

    switch (ch)
    {
    
    
    case 'a':
    {
    
    
        if (list_is_empty(parr))
        {
    
    
            printf("顺序表是空表!\n");
        }
        else
        {
    
    
            printf("顺序表非空表!\n");
        }
        break;
    }
    case 'b':
    {
    
    
        printf("顺序表长度: %d\n当前元素个数: %d\n", MAXSIZE, list_length(parr));
        break;
    }
    case 'c':
    {
    
    
        if (find_value(parr, input_pos(&pos), &val))
        {
    
    
            printf("顺序表中第%d个数据元素是%d\n", pos, val);
        }
        break;
    }
    case 'd':
    {
    
    
        pos = find_index(parr, input(&val));
        if (pos != -1)
        {
    
    
            printf("%d是顺序表中是第%d个数据元素", val, pos);
        }
        else
        {
    
    
            printf("数据元素%d不在此顺序表中!\n", val);
        }
        break;
    }
    case 'e':
    {
    
    
        if (insert(parr, input_pos(&pos), input(&val)))
        {
    
    
            printf("在第%d个位置添加数据元素%d成功!\n", pos, val);
        }
        break;
    }
    case 'f':
    {
    
    
        if (cancel(parr, input_pos(&pos)))
        {
    
    
            printf("删除第%d个数据元素成功!\n", pos);
        }
        break;
    }
    case 'g':
    {
    
    
        if (list_is_empty(parr))
        {
    
    
            printf("此顺序表为空表!无法进行遍历!\n");
            break;
        }
        traverse(parr);
        break;
    }
    }
    printf("\n\n\n\n\n\n\n\n\n\n\n\n");
    return;
}

//arraylist.h

#ifndef ARRAYLIST_H_
#define ARRAYLIST_H_
#include <stdbool.h>
#define MAXSIZE 100

typedef int elemtype; //本程序使用的数据元素是最简单的整型元素;

typedef struct array
{
    
    
    elemtype *elem; //顺序表的首地址;
    int length;     //顺序表的总长度;
    int capacity;   //顺序表的当前元素个数;
} arraylist;

//1) 构造一个空的顺序表;
void init_list(arraylist *parr);
/*----------------------------------------------------------------------*/

//2) 若顺序表已存在则销毁整个顺序表;
void destroy_list(arraylist *parr);
/*----------------------------------------------------------------------*/

//3) 若顺序表已存在则判断是否为空表;
bool list_is_empty(arraylist *parr);
/*----------------------------------------------------------------------*/

//4) 若顺序表已存在则获取数据元素个数;
int list_length(arraylist *parr);
/*----------------------------------------------------------------------*/

//5) 若顺序表已存在且非空表,位置满足1<=pos<=length,则用*val存取并返回第i个数据元素的值;
bool find_value(arraylist *parr, int pos, elemtype *val);
/*----------------------------------------------------------------------*/

//6) 若顺序表已存在且非空表则返回第一个与val值相同的元素在表中的位置,若无相同元素则返回-1;
int find_index(arraylist *parr, elemtype val);
/*----------------------------------------------------------------------*/

//7) 若顺序表已存在且位置满足1<=pos<=length+1则在第i个位置前添加新元素val,长度加1;
bool insert(arraylist *parr, int pos, elemtype val);
/*----------------------------------------------------------------------*/

//8) 若顺序表已存在且非空表,位置满足1<=pos<=length则删除第i个数据元素,长度减1;
bool cancel(arraylist *parr, int pos);
/*----------------------------------------------------------------------*/

//9) 若顺序表已存在且非空表则遍历其中所有数据元素;
void traverse(arraylist *parr);
/*----------------------------------------------------------------------*/

#endif

//arraylist.c

#include <stdio.h>
#include <stdlib.h>
#include "arraylist.h"

void init_list(arraylist *parr)
{
    
    
    parr->elem = (elemtype *)malloc(MAXSIZE * sizeof(elemtype));
    if (NULL == parr->elem)
    {
    
    
        fprintf(stderr, "动态内存分配失败!本程序退出!\n");
        exit(EXIT_FAILURE);
    }
    parr->length = MAXSIZE;
    parr->capacity = 0;
    return;
}

void destroy_list(arraylist *parr)
{
    
    
    free(parr->elem);
    return;
}

bool list_is_empty(arraylist *parr)
{
    
    
    return 0 == parr->capacity ? true : false;
}

int list_length(arraylist *parr)
{
    
    
    return parr->capacity;
}

bool find_value(arraylist *parr, int pos, elemtype *val)
{
    
    
    if (pos < 1 || pos > parr->capacity) //若位置pos小于1或大于当前容量capacity则不合理;
    {
    
    
        printf("位置有误!获取数据失败!\n");
        return false;
    }
    *val = parr->elem[pos - 1];
    return true;
}

int find_index(arraylist *parr, elemtype val)
{
    
    
    int i;

    for (i = 0; i < parr->capacity; i++)
    {
    
    
        if (parr->elem[i] == val)
        {
    
    
            return i + 1;
        }
    }
    return -1;
}

bool insert(arraylist *parr, int pos, elemtype val)
{
    
    
    int i;

    if (MAXSIZE == parr->capacity)
    {
    
    
        printf("此顺序表存储空间不足!添加失败!\n");
        return false;
    }
    if (pos < 1 || pos > parr->capacity + 1)
    {
    
    
        printf("您输入的位置不合理!添加失败!\n");
        return false;
    }
    for (i = parr->length - 1; i >= pos - 1; i--)
    {
    
    
        parr->elem[i + 1] = parr->elem[i];
    }
    parr->elem[pos - 1] = val;
    ++parr->capacity;
    return true;
}

bool cancel(arraylist *parr, int pos)
{
    
    
    int i;

    if (pos < 1 || pos > parr->capacity) //删除时位置小于1或大于当前表长length,则删除失败;
    {
    
    
        printf("您输入的位置不合理!删除失败!\n");
        return false;
    }
    for (i = pos; i < parr->length; i++)
    {
    
    
        parr->elem[i - 1] = parr->elem[i];
    }
    --parr->capacity;
    return true;
}

void traverse(arraylist *parr)
{
    
    
    int i;

    printf("此顺序表中%d个数据元素是:\n", parr->capacity);
    for (i = 0; i < parr->capacity; i++)
    {
    
    
        printf("%-8d", parr->elem[i]);
        if (0 == (i + 1) % 10)
        {
    
    
            putchar('\n');
        }
    }
    return;
}

//----------------------------------------------------------------------------

//----------------------------2021年1月11日 -------------------------------

猜你喜欢

转载自blog.csdn.net/m0_46181359/article/details/112492759