最新消息:点击查看大S的省钱秘笈

线性表玩具之顺序表版本(C语言)

编程相关 Slyar 1983浏览 0评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

本来不想发这么水的代码,可是最近也没什么好写的…纯当凑文章数目吧…

这是一个线性表操作的小玩具,此篇为顺序表版本,也就是用数组的。

/*
线性顺序表操作
Slyar 2009.3.26
//www.slyar.com
*/

#include 
#include 

#define MAXLISTSIZE 1024

/* 定义顺序表节点类型 */
typedef struct
{
    int data[MAXLISTSIZE];
    int last;
}linearlist;

/* 函数声明部分 */
linearlist* CreateList();
void Output(linearlist*);
void AppendNode(linearlist*, int);
void InsertNode(linearlist*, int, int);
void ReadNode(linearlist*, int);
void SearchFromList(linearlist*, int);
void DeleteNode(linearlist*, int);
void UpdateNode(linearlist*, int, int);
void ListList(linearlist*);

/* 主函数 */
int main()
{
    int key, pos;
    char ch;
    linearlist *slist;
    slist = CreateList();
    while(1){
        Output(slist);
        printf("请选择:");
        ch = getchar();
        fflush(stdin);
        if(ch == 'a')
        {
            printf("请输入要追加的数据:");
            scanf("%d", &key);
            fflush(stdin);
            AppendNode(slist, key);
            Output(slist);
        }
        else
        if(ch == 'i')
        {
            printf("请输入要插入的数据的位置:");
            scanf("%d", &pos);
            fflush(stdin);
            printf("请输入要插入的数据:");
            scanf("%d", &key);
            fflush(stdin);
            InsertNode(slist, key, pos);
            Output(slist);
        }
        else
        if(ch == 'd')
        {
            printf("请输入要删除的数据的位置:");
            scanf("%d", &pos);
            fflush(stdin);
            DeleteNode(slist, pos);
            Output(slist);
        }
        else
        if(ch == 'r')
        {
            printf("请输入要读取的数据的位置:");
            scanf("%d", &pos);
            fflush(stdin);
            ReadNode(slist, pos);
            Output(slist);
        }
        else
        if(ch == 'u')
        {
            printf("请输入要修改的数据的位置:");
            scanf("%d", &pos);
            fflush(stdin);
            printf("请输入要修改的数据:");
            scanf("%d", &key);
            fflush(stdin);
            UpdateNode(slist, key, pos);
            Output(slist);
        }
        else
        if(ch == 's')
        {
            printf("请输入要查找的数据:");
            scanf("%d", &key);
            fflush(stdin);
            SearchFromList(slist, key);
            Output(slist);
        }
        else
        if(ch == 'e')
        {
            exit(0);
        }
    }
    system("pause");
    return 0;
}

/* 打印说明文档 */
void Output(linearlist* list)
{
    system("cls");
    printf("--------------------------------------\n");
    printf("-  欢迎使用线性顺序表                -\n");
    printf("-                                    -\n");
    printf("-  用法:                             -\n");
    printf("-  a: 追加一个节点                   -\n");
    printf("-  i: 插入一个节点                   -\n");
    printf("-  d: 删除一个节点                   -\n");
    printf("-  r: 读取指定节点的值               -\n");
    printf("-  u: 修改指定节点的值               -\n");
    printf("-  s: 查找顺序表                     -\n");
    printf("-  e: 退出                           -\n");
    printf("--------------------------------------\n");
    ListList(list);   
}

/* 创建线性顺序表 */
linearlist* CreateList()
{
    linearlist *slist = (linearlist*)malloc(sizeof(linearlist));
    slist -> last = 0;
    return slist;
}

/* 追加节点 */
void AppendNode(linearlist* list, int n)
{
    if(list -> last < MAXLISTSIZE - 1)
    {
        list -> data[list -> last] = n;
        list -> last += 1;
    }
    else
    {
        printf("线性表已满\n");
    }
}

/* 插入节点 */
void InsertNode(linearlist* list, int n, int pos)
{
    int j;
    if(pos < 1 || pos > list -> last + 1)
    {
        printf("所插入的位置超出顺序表的范围\n");
        system("pause");
    }
    else
    {
        for(j = list -> last; j >= pos-1; j--)
        {
            list -> data[j+1] = list -> data[j];
        }
        list -> data[pos-1] = n;
        list -> last++;
    }
}

/* 读取节点 */
void ReadNode(linearlist* list, int pos)
{
    if(pos < 0 || pos > list -> last)
    {
        printf("所读取的位置超出顺序表的范围\n");
    }
    printf("位置%d中的数据是:%d\n", pos, list -> data[pos-1]);
    system("pause");
}

/* 查找节点 */
void SearchFromList(linearlist* list, int n)
{
    int i, sign = 0;
    for(i = 0; i <= list -> last; i++)
    {
        if(n == list -> data[i])
        {
            sign = 1;
            printf("在位置[%d]处找到此数据\n", i+1);
        }
    }
    if (!sign)
    {
        printf("找不到此数据!\n");
    }
    system("pause");
}

/* 删除节点 */
void DeleteNode(linearlist* list, int pos)
{
    int j;
    if((pos < 1) || (pos > list -> last + 1))
    {
        printf("所要删除的位置超出顺序表的范围\n");
        system("pause");
    }
    else
    {
        for(j = pos; j <= list -> last; j++)
        {
            list -> data[j-1] = list -> data[j];
        }
        list -> last--;
    }
}

/* 编辑节点 */
void UpdateNode(linearlist* list, int n, int pos)
{
    if(pos < 0 || pos > list -> last)
    {
        printf("所读取的位置超出顺序表的范围\n");
        system("pause");
    }
    else
    {
        list -> data[pos-1] = n;
    }
}

/* 打印线性顺序表 */
void ListList(linearlist* list)
{
    int i;
    printf("当前线性表的状态:\n");
    if(list -> last == 0)
    {
        printf("当前顺序表为空\n");
    }
    else
    {
        for(i = 0; i < (list -> last); i++)
        {
            printf("[%d]", list -> data[i]);
        }
        printf("\n");
    }
}

转载请注明:Slyar Home » 线性表玩具之顺序表版本(C语言)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址