线性表基本操作

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE   10 //初始分配量
#define LISTINCREMENT   5  //分配增量
typedef int ElemType;
typedef  struct
{
    ElemType *elem;//存储空间基址
    int length; //当前长度
    int ListSize; //当前分配的存储
} sqlist;

int InitList_sq(sqlist *l)  /*initial the list l*///形参是一个结构体指针
{
  l->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));//初始化十个int容量
  if(!l->elem) // if l->elem == NULL 前面有个!就代表if里的值为true
   {
      printf("无法分配空间!");
      return 1;
   }
  else
   {
      l->length=0;//当前长度置为0
      l->ListSize=LIST_INIT_SIZE;
      //printf("ok\n");
      return 0;
   }
}
int ListInsert_sq(sqlist &l, int i, int e)//增
{
    //线性表l第i个位置前插入e
    //从i起到最后一个向后移一位,注意先从最后一个开始移
    ElemType *p, *q;
    if(i < 1 || i > l.length + 1)//插入位置有误
        return 0;
    if(l.length >= l.ListSize)//存储空间已满,增加空间
    {
        ElemType *newelem = (ElemType *)realloc(l.elem,(l.ListSize+LISTINCREMENT) * sizeof(ElemType));
        if(!newelem)
        {
            exit(0);
        }
        l.elem = newelem;//更新基址
        l.ListSize += LISTINCREMENT;//更新分配量
    }
    q = &(l.elem[i-1]); //q是插入位置
    for(p = &(l.elem[l.length-1]); p >= q; p--)
    {
        *(p+1) = *(p);
    }
    *q = e;
    l.length++;
    return 1;
}
int Delete_sq(sqlist &l, int i, ElemType &e)//删
{
    ElemType *q, *p;
    if(i < 1 || i > l.length || l.length == 0) //删除位置有误或者l是个空表
        return 0;
    p = &(l.elem[i-1]);//删除元素的位置
    e = *p;
    q = &(l.elem[l.length - 1]);//最后一个元素
    for(;p < q;p++)
    {
        *(p) = *(p+1);
    }
    l.length--;
    return 1;
}
int FindValue_sq(sqlist &l, ElemType e)//查按值
{
    int j;
    if(l.length == 0)
        return 0;
    for(int i = 0; i < l.length; i++)
    {
        if(l.elem[i] == e)
        {
            j = i;
            break;
        }
    }
    if(i >= l.length)
    {
        printf("线性表中无这个值\n");
        return 0;
    }
    return j+1;
}
int FindIndex_sq(sqlist &l, int i, ElemType &e)//查 按位置
{
    if(i <= 0 || i >= l.length-1)
    {
        printf("查找位置有误\n");
        return -1;
    }
    e = l.elem[i-1];
    return e;
}
void change(sqlist &l, int i, ElemType &e)
{
    if(i <= 0 || i >= l.length-1)
        return;
    l.elem[i-1] = e;
}
void show(sqlist &l)//显示
{
    for(int i = 0; i < l.length; i++)
    {
        printf("%d ",l.elem[i]);
    }
    printf("\n");
}
void ui()
{
    printf("    欢迎进入顺序表操作界面\n");
    printf("  1.插入数据\n");
    printf("  2.删除数据\n");
    printf("  3.修改数据\n");
    printf("  4.查找数据\n");
    printf("  5.显示数据\n");
    printf("  6.退出程序\n");
}
void FindUi()
{
    printf("  1.按位置查找\n");
    printf("  2.按值查找\n");
    printf("  3.返回\n");
}
int main()
{
    sqlist L;
    int i, j,k, select;
    int e;
    InitList_sq(&L);
    for(i = 1; i <= 10; i++)
    ListInsert_sq(L,i,11-i);//第i个插入i
    while(1)
    {
        ui();
        scanf("%d",&select);
        if(select == 1)
        {
            show(L);
            fflush(stdin);
            //system("cls");
            printf("请输入要插入的位置:");
            scanf("%d",&i);
            printf("请输入插入的值:");
            scanf("%d",&e);
            ListInsert_sq(L,i,e);//第i个插入i
            printf("数据已插入\n");
            show(L);
            fflush(stdin);
            printf("按任意键返回\n");
            getchar();
            system("cls");
        }
        else if(select == 2)
        {
            show(L);
            fflush(stdin);
            printf("请输入删除的位置:");
            scanf("%d",&i); //删除第i个数
            Delete_sq(L,i,e);
            printf("数据已删除\n");
            show(L);
            fflush(stdin);
            printf("按任意键返回\n");
            getchar();
            system("cls");
        }
        else if(select == 3)
        {
            show(L);
            fflush(stdin);
            printf("请输入要修改的位置:");
            scanf("%d",&i);
            printf("请输入修改后的值:");
            scanf("%d",&e);
            change(L, i, e);
            printf("数据已修改\n");
            show(L);
            fflush(stdin);
            printf("按任意键返回\n");
            getchar();
            system("cls");
        }
        else if(select == 4)
        {
            while(1)
            {
                int find_select;
                system("cls");
                FindUi();
                scanf("%d",&find_select);
                fflush(stdin);
                if(find_select == 1)
                {
                    show(L);
                    scanf("%d",&i); //查找第i个数
                    e = FindIndex_sq(L,i,e);
                    if(e!=-1)
                    printf("%d\n",e);
                    fflush(stdin);
                    printf("按任意键返回\n");
                    getchar();
                    //system("cls");
                }
                else if(find_select == 2)
                {
                    show(L);
                    scanf("%d",&e);
                    j = FindValue_sq(L,e);
                    printf("%d\n",j);
                    fflush(stdin);
                    printf("按任意键返回\n");
                    getchar();
                    //system("cls");
                }
                else 
                {
                    system("cls");
                    break;      
                }
            }
        }
        else if(select == 5)
        {
            fflush(stdin);
            show(L);
            printf("按任意键返回\n");
            getchar();
            system("cls");
        }
        else
        {
            return 0;
        }
    }
}

转载于:https://www.cnblogs.com/pjc20/p/6657427.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值