C语言线性表的顺序存储(一)各种添加删除

版权声明:转载请注明本文链接 https://blog.csdn.net/qq_31844349/article/details/85320814

顺序存储结构的处理

什么是顺序存储结构?

顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的结点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。查看具体.

顺序表的存储示意图

在这里插入图片描述

代码操作

初始化线性表

//初始化链表
void InitList(PSeqList L){
    if(isEmpty(L)){
        exit(-1);
    }
    L->length = 0;
}

在指定位置插入数据

//在指定位置插入数据
void insertDataToPos(PSeqList L,int data,int pos){
    if(isEmpty(L)|| L->length<1 || pos > L->length){
        printf("线性表存在问题");
        //非正常退出
        exit(-1);
    }
    for(int i = L->length;i>pos;i--){
        L->data[i] = L->data[i-1];
    }
    L->data[pos] = data;
    L->length++;
}

获取线性表的长度

//获取线性表的长度
int getLengthList(PSeqList L){
    if(isEmpty(L)){
        printf("现行表为空");
        return 0;
    }
    return L->length;
}

在队头插入数据

//在队头插入数据
void insertDataToHeat(PSeqList L,int data){
    if(L->length == ListSize){
        printf("队列已满");
    }
    //将表中的元素后移
    for (int i = L->length;i>0;i--) {
        L->data[i] = L->data[i - 1];
    }
    L->data[0] = data;
    L->length++;
}

在队尾插入数据

//在队尾插入
void insertDateToTail(PSeqList L,int data){
    if(isEmpty(L)){
        printf("你的线性表不存在");
        exit(-1);
    }
    //在队尾插入数据,就是在线性表的最后面插入,最后面就是线性表的长度
    L->data[L->length] = data;
    L->length++;
}

删除指定位置数据

//删除指定位置数据
void deleteDataToPos(PSeqList L,int pos){
    if(isEmpty(L) || L->length<pos){
        printf("所要删除的数据有问题");
        exit(-1);
    }
    for(int i = pos;i<L->length;i++){
        L->data[i] = L->data[i+1];
    }
    L->length--;
}

获取指定位置数据

//获取指定位置数据
int getTableToPos(PSeqList L,int pos){
    if(isEmpty(L) || pos>L->length||pos<0){
        printf("输入的位置是错误的");
        exit(-1);
    }
    return L->data[pos];
}

打印表数据

//打印表数据
void printf_table(PSeqList L){
    if(isEmpty(L)){
        printf("表是空的");
        exit(-1);
    }
    for (int i= 0;i<L->length;i++) {
        printf("%d\t",L->data[i]);
    }
    printf("\n");
}

清空表

//清空表
void empty_Table(PSeqList L){
    if(isEmpty(L)){
        printf("表是空的");
        exit(-1);
    }
    L->length = 0;
}

队头删除数据

//队头删除数据
void deleteDataToHeart(PSeqList L){
    if(isEmpty(L)){
        printf("队列是空的");
        exit(-1);
    }
    for (int i = 0;i<L->length;i++) {
        L->data[i] = L->data[i+1];
    }
    L->length--;
}

队尾删除数据

//队尾删除数据
void deleteDataToTail(PSeqList L){
    if(isEmpty(L)){
        printf("队列是空的");
        exit(-1);
    }
    L->length--;
}

判断是否为空

//判断是否为空
int isEmpty(PSeqList L){
    if(L == NULL){
        return 1;
    }else{
        return 0;
    }
}

整个操作代码

//
//  main.c
//  test
//
//  Created by dark on 2018/12/22.
//  Copyright © 2018年 dark. All rights reserved.
//  注:专业解释,所有线性表的插入删除问题全都是考虑的for循环条件的问题

#include <stdio.h>
#define ListSize 100

typedef struct{
    int data[ListSize];
    int length;
}SeqList,*PSeqList;

//初始化线性表
void InitList(PSeqList L);
//获取线性表的长度
int getLengthList(PSeqList L);
//在对头插入数据
void insertDataToHeat(PSeqList L,int data);
//在队尾插入
void insertDateToTail(PSeqList L,int data);
//指定位置插入数据
void insertDataToPos(PSeqList L,int data,int pos);
//删除指定位置数据
void deleteDataToPos(PSeqList L,int pos);
//返回线性表的指定元素值
int getTableToPos(PSeqList L,int pos);
//打印表数据
void printf_table(PSeqList L);
//清空
void empty_Table(PSeqList L);
//队头删除数据
void deleteDataToHeart(PSeqList L);
//队尾删除数据
void deleteDataToTail(PSeqList L);
//判空处理
int isEmpty(PSeqList L);

int main(int argc, const char * argv[]) {
    SeqList L;
    //初始化现行表
    InitList(&L);
    //在对头插入数据
    insertDataToHeat(&L,22);
    insertDataToHeat(&L,100);
    insertDataToHeat(&L,40);
    //在指定位置插入数据
    insertDataToPos(&L,88,1);
    insertDataToPos(&L,33,2);
    //在队尾插入数据
    insertDateToTail(&L,1998);
    //获取指定位置的数据
    printf("获取到的指定位置的数据:%d\n",getTableToPos(&L,3));
    //删除指定位置的数据
    deleteDataToPos(&L,1);
    //打印线性表的数据
    for(int i = 0;i<L.length;i++){
        printf("%d\t",L.data[i]);
    }
    printf("\n");
    //打印表数据
    printf_table(&L);
    //清空表
    //empty_Table(&L);
    //打印表数据
    printf_table(&L);
    //对头删除数据
    deleteDataToHeart(&L);
    //打印表数据
    printf_table(&L);
    //队尾删除数据
    deleteDataToTail(&L);
    //打印表数据
    printf_table(&L);
    printf("线性表长度:%d",L.length);
    return 0;
}

//初始化链表
void InitList(PSeqList L){
    if(isEmpty(L)){
        exit(-1);
    }
    L->length = 0;
}

//在指定位置插入数据
void insertDataToPos(PSeqList L,int data,int pos){
    if(isEmpty(L)|| L->length<1 || pos > L->length){
        printf("线性表存在问题");
        //非正常退出
        exit(-1);
    }
    for(int i = L->length;i>pos;i--){
        L->data[i] = L->data[i-1];
    }
    L->data[pos] = data;
    L->length++;
}

//获取线性表的长度
int getLengthList(PSeqList L){
    if(isEmpty(L)){
        printf("现行表为空");
        return 0;
    }
    return L->length;
}

//在对头插入数据
void insertDataToHeat(PSeqList L,int data){
    if(L->length == ListSize){
        printf("队列已满");
    }
    //将表中的元素后移
    for (int i = L->length;i>0;i--) {
        L->data[i] = L->data[i - 1];
    }
    L->data[0] = data;
    L->length++;
}

//在队尾插入
void insertDateToTail(PSeqList L,int data){
    if(isEmpty(L)){
        printf("你的线性表不存在");
        exit(-1);
    }
    //在队尾插入数据,就是在线性表的最后面插入,最后面就是线性表的长度
    L->data[L->length] = data;
    L->length++;
}

//删除指定位置数据
void deleteDataToPos(PSeqList L,int pos){
    if(isEmpty(L) || L->length<pos){
        printf("所要删除的数据有问题");
        exit(-1);
    }
    for(int i = pos;i<L->length;i++){
        L->data[i] = L->data[i+1];
    }
    L->length--;
}

//获取指定位置数据
int getTableToPos(PSeqList L,int pos){
    if(isEmpty(L) || pos>L->length||pos<0){
        printf("输入的位置是错误的");
        exit(-1);
    }
    return L->data[pos];
}

//打印表数据
void printf_table(PSeqList L){
    if(isEmpty(L)){
        printf("表是空的");
        exit(-1);
    }
    for (int i= 0;i<L->length;i++) {
        printf("%d\t",L->data[i]);
    }
    printf("\n");
}

//清空表
void empty_Table(PSeqList L){
    if(isEmpty(L)){
        printf("表是空的");
        exit(-1);
    }
    L->length = 0;
}

//队头删除数据
void deleteDataToHeart(PSeqList L){
    if(isEmpty(L)){
        printf("队列是空的");
        exit(-1);
    }
    for (int i = 0;i<L->length;i++) {
        L->data[i] = L->data[i+1];
    }
    L->length--;
}

//队尾删除数据
void deleteDataToTail(PSeqList L){
    if(isEmpty(L)){
        printf("队列是空的");
        exit(-1);
    }
    L->length--;
}

//判断是否为空
int isEmpty(PSeqList L){
    if(L == NULL){
        return 1;
    }else{
        return 0;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31844349/article/details/85320814