zoukankan      html  css  js  c++  java
  • 顺序表基础操作--练习

    顺序表基础操作

    • 存入并顺序打印数字
      //最近修改:9/21,添加插入和删除多个数字
      //9/22,修改,范围问题
    • 测试图如下:
      这里写图片描述
    #include<stdio.h>
    #include<stdlib.h>
    #define N 20
    #define OK 1
    #define ERROR -1
    typedef struct {
        int *elem;
        int length;
        int listsize;
    }SqList;
    
    int Init(SqList *L);                                    //初始化顺序表
    int ListInsert_Sq(SqList *L, int i, int e);             //在顺序表中第i个位置插入元素e
    void ListPrint(SqList M);                               //顺序打印表中元素
    void ListAdd_Sq(SqList *L, int e);                      //插入e之后仍然递增,前提L是顺序表
    int ListDelete_X_Sq(SqList *L, int x);                  //删除值为x的元素,成功则返回1,否则返回0
    int ListDelete_Sq(SqList *L, int i, int e);             //删除第i个元素
    int ListDeleteFromI_to_K(SqList *L, int i, int k);      //已知一个顺序表L,从第i个元素起连续删除k个元素,这里包含第i个元素
    
    int main(void)
    {
        int i, n = 8, e, temp, k;
        SqList M;
        Init(&M);
        printf("Input %d numbers,please:
    ", n);
        for (i = 1; i <= n; i++)
        {
            scanf("%d", &e);
            ListInsert_Sq(&M, i, e);
        }
        ListPrint(M);
        printf("
    Input a number to insert:");
        scanf("%d", &temp);
        ListAdd_Sq(&M, temp);
        ListPrint(M);
        printf("
    Input the number you want to delete:");
        scanf("%d", &temp);
        ListDelete_X_Sq(&M, temp);
        ListPrint(M);
        printf("
    Delete the I element:");
        scanf("%d",&temp);
        ListDelete_Sq(&M, temp, e);
        ListPrint(M);
        printf("
    Delete k elements continuously from the I element
    ");
        scanf("%d %d", &i, &k);
        if (ListDeleteFromI_to_K(&M, i, k) != OK)
        {
            printf("out of range!
    ");
            exit(ERROR);
        }
        printf("
    After delete:");
        ListPrint(M);
        free(M.elem);   //释放内存
        return 0;
    }
    
    int Init(SqList *L)     //初始化顺序表
    {
        L->elem = (int *)malloc(N * sizeof(int));
        if (!L->elem)
            return ERROR;
        L->length = 0;
        L->listsize = N;
        return OK;
    }
    
    int ListInsert_Sq(SqList *L, int i, int e)  //在顺序表中第i个位置插入元素e
    {
        int *p, *q;
        if (i < 1 || i > L->length + 1)
            return ERROR;
        q = &(L->elem[i - 1]);
        for (p = &(L->elem[L->length + 1]); p >= q; --p)
            *(p + 1) = *p;
        *q = e;
        ++L->length;
        return OK;
    }
    
    void ListPrint(SqList M)    //顺序打印表中元素
    {
        int *p;
        printf("
    The Result:
    ");
        for (p = M.elem; p <= (M.elem + M.length - 1); p++)
            printf("%d ", *p);
        printf("
    ");
    }
    
    void ListAdd_Sq(SqList *L, int e)  //插入e之后仍然递增,前提L是顺序表
    {
        int *p, *q;
        p = L->elem;
        q = L->elem + L->length - 1;
        while (p <= q && *p<e)
            p++;
        for (; q >= p; q--)
            *(q + 1) = *q;
        *p = e;
        L->length++;
    }
    
    int ListDelete_X_Sq(SqList *L, int x) //删除值为x的元素,成功则返回1,否则返回0
    {
        int *p, *q;
        p = L->elem;
        q = L->elem + L->length - 1;
        while (*p != x&&p <= q)
            p++;
        if (p > q) return ERROR;
        for (p++; p <= q; p++)
            *(p - 1) = *p;
        L->length--;
        return OK;
    }
    
    int ListDelete_Sq(SqList *L,int i,int e)
    {
        int *p,*q;
        if (i < 1 || (i > L->length))   //i值不合法
            return ERROR;           
        p =&(L->elem[i - 1]);           //p为被删除元素的位置
        e = *p;                         //被删除元素的值赋给e
        q = L->elem + L->length - 1;    //表尾位置
        for (++p; p <= q; ++p)          //元素左移
            *(p - 1) = *p;      
        --L->length;                    //表长减1
        return OK;
    }
    
    int ListDeleteFromI_to_K(SqList *L, int i, int k)//已知一个顺序表L,从第i个元素起删除k个元素,这里包含第i个元素
    {
        int *p, *q;
        if (i<1 || k> L->length - i + 1 || k<1)
            return ERROR;
        p = &L->elem[i - 2];
        q = L->elem + L->length - 1;
        for (p++; p<q; p++)
            *p = *(p + k);
        L->length = L->length - k;
        return OK;
    }
    
  • 相关阅读:
    003 Leaflet 第三个demo 地图上的面积测量
    002 Leaflet 第二个demo 地图上的矩形拉框选择
    001 Leaflet 第一个demo 加载天地图
    This关键字,打印花瓣的数量
    Myeclipse8.5 添加Tomcat7
    WGS84经纬度 与 web 墨卡托相互转化 工具类
    java list集合去重复
    response 下载文件
    jquery实现可拖拽的div
    linux 前端环境搭建
  • 原文地址:https://www.cnblogs.com/FlyerBird/p/9052562.html
Copyright © 2011-2022 走看看