顺序存储结构的基本操作

2019-08-17  本文已影响0人  mark_x
// 使用malloc函数为结构体申请动态内存空间
#include <stdio.h>
#include <stdlib.h>

#define MAX 128

typedef struct
{
    int data[MAX];
    int length;
}SqList;

void getElem(SqList *L, int i, int **sp)
{
    if (L->length == 0 || i < 1 || i > L->length)
    {
        printf("Call failure!");
    }
    
    *sp = &(L->data[i-1]);
    
}


void listInsert(SqList *L, int i, int num)
{
    // 错误检查
    if (L->length == MAX)  // 顺序表已满
    {
        printf("顺序表已满,无法插入新元素!");
    }
    if (i <= 0 || i > L->length+1) // 注意:L=length+1是允许的,即新增元素在最后
    {
        printf("元素插入位置超出范围!");
    }
    
    // 如果不是插入最后一个位置,元素后移,为新元素空出一个位置
    if (i <= L->length)
    {
        for (int k = L->length-1; k >= i-1; k--)
        {
            L->data[k+1] = L->data[k];
        }
    }
    
    L->data[i-1] = num;
    L->length++;
}

// 初始条件:顺序线性表已存在
// 操作结果:在L中第i个位置插入新的元素e,L的长度加1
int delElem(SqList *L, int i)
{
    if (L->length == 0 || i < 1 || i > L->length)
    {
        printf("Call failure!");
    }
    
    // 删除只需要往前移动覆盖就可以
    // 将删除的值返回
    int del_elem;
    del_elem = L->data[i-1];
    for (int k = i-1; k < L->length - 1; k++)
    {
        L->data[k] = L->data[k+1];
    }
    
    L->length--;
    return del_elem;
}

void printList(SqList *L)
{
    for (int i = 0; i < L->length; i++)
    {
        printf("%d  ", L->data[i]);
    }
    printf("\n");
}

int main()
{
    SqList *sqlist;// 定义结构体指针
    sqlist = (SqList *)malloc(sizeof(SqList)); // 申请动态内存空间
    
    for (int i = 0; i < 20; i++)    // 初始化结构体对象
    {
        sqlist->data[i] = i + 1001;
    }
    sqlist->length = 20;
    
    printList(sqlist);
    
    // 操作1:查询获得顺序列表元素
    int *ptr_elem = NULL, posi;
    printf("要查询第几个数:");
    scanf("%d", &posi);
    getElem(sqlist, posi, &ptr_elem);  // 获得数组的第二个元素,使指针ptr_elem指向该元素
    
    printf("数组的第2个元素为:%d\n", *ptr_elem);
    
    // 操作2:插入操作

    int elem;
    printf("要在什么位置插入什么数,如(11-1001): ");
    scanf("%d-%d", &posi, &elem);
    listInsert(sqlist, posi, elem);
    printList(sqlist);
    
    // 操作3:删除操作
    int del_elem;
    printf("要删除第几个数:");
    scanf("%d", &posi);
    del_elem = delElem(sqlist, posi);
    printf("删除的数是:%d\n", del_elem);
    printList(sqlist);
    
    
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读