考研数据结构C语言-顺序表实现以及基本操作【指针方式】

考研C语言顺序表实现以及基本操作【基于指针方式】

1.指针理解, 指针方式和静态数组的区别
2.动态扩容
3.插入、删除、查找元素
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
#define InitSize 5
/*
顺序表-指针方式实现一些基本操作
指针: 保存地址的变量
    int *a 与  int b[10]对比
        1.这里b的意思是数组b的首地址, 所以这里a 相当于 b
        2.获取数组a的第一个元素可以通过 *(a+1) 或者 a[1] 的方式, 相当于在数组b里面获取第一个元素 b[1]
        3.跟据下标给数组赋值指针方式与静态数组方式对比
            指针: scanf("%d", a+i)
            静态数组: scanf("%d", &b[i])
*/

typedef struct Sequence {
    
    
    int *data;   // 定义动态分配数组的指针变量  
    int length;  // 当前顺序表长度
    int MaxSize;  // 定义最大长度
} SeqList;


// 初始化顺序表
void InitSeq(SeqList &L){
    
    
    /*
		malloc接收一个整型参数
		malloc(20)代表申请20个字节的内存空间
		返回申请内存空间的首地址
	*/
    L.data = (int *)malloc(sizeof(int)*InitSize);  // 动态申请连续的内存地址空间
    L.length = 0;
    L.MaxSize = InitSize;
}

// 顺序表动态扩容
bool IncreaseSeq(SeqList &L, int len){
    
         
    int *p = L.data;
    L.data = (int *)malloc(sizeof(int)*(InitSize + len));
    if(p==NULL)
        return false;
    for(int i=0; i<L.MaxSize; i++){
    
    
        L.data[i] = p[i];
    };
    free(p);
    L.MaxSize += len;
    return true;
}

// 按位查找元素
int GetElement(SeqList &L, int i){
    
    
    // assert(i > 0 && i <= L.MaxSize );
    if (i < 1 || i > L.MaxSize)
        return -1;  // 超出范围返回-1
    return L.data[i-1];
}

// 按位插入元素
bool InsertElement(SeqList &L, int i, int e){
    
    
    /*
    思路:指定位置的后面的元素都要往后挪动一位, 也包括指定位置的元素
    */
    // 插入位置要在当前长度内
    if(i < 1 || i > L.length + 1)
        return false;
    // 当前长度已经等于最大容量不支持移动数据了
    if(L.length == L.MaxSize)
        return false;
    // 插入的元素位置所有元素往后挪
    for(int j = L.length; j >= i; j--){
    
    
        L.data[j] = L.data[j-1];
    };
    // 插入元素
    L.data[i-1] = e;
    L.length++;
    return true;
}

// 按位删除元素
bool DelElement(SeqList &L, int j){
    
    
    /*
    思路:将要删除的元素的位置后面的元素全部往前挪动一位,从指定位置开始
    */
    if(j < 1 || j > L.length)
        return false;
    for(int i = j; i <= L.length; i++){
    
    
        L.data[i-1] = L.data[i];
    };
    L.length--;
    return true;
}

// 预添加数据
bool InitElements(SeqList &L, int len){
    
    
    if(len < 1 || len > L.MaxSize)
        return false;
    printf("输入要添加的元素:\n");
    for(int i = 0; i<len; i++){
    
    
        // 根据指针地址赋值
        scanf("%d", L.data+i);
        // 如果是静态的顺序表 则需要scanf("%d", &L.data[i]);
        L.length++;
    };
    return true;
}

// 打印顺序表数据
void PrintfElements(SeqList &L){
    
    
    if(L.length > 0)
        printf("元素打印:\n");
        for(int i = 0; i<L.length; i++){
    
    
            // printf("%d\n", *(L.data + i));
            printf("%d\n", L.data[i]);  
        }
}

// main 函数
int main(){
    
    
    SeqList L;   // 定义顺序表
    InitSeq(L);   // 初始化
    IncreaseSeq(L, 5);  // 扩容
    printf("扩容之后的最大长度是%d\n", L.MaxSize);
    InitElements(L, 4);  // 预添加元素
    PrintfElements(L);
    int a = GetElement(L,11);
    printf("取得值为: %d", a);
    InsertElement(L, 2, 3);  // 插入元素
    DelElement(L, 1);
    PrintfElements(L);
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_49501453/article/details/129088585