1. 程式人生 > >C語言線性表的順序儲存(一)各種新增刪除

C語言線性表的順序儲存(一)各種新增刪除

順序儲存結構的處理

什麼是順序儲存結構?

順序儲存結構是儲存結構型別中的一種,該結構是把邏輯上相鄰的結點儲存在物理位置上相鄰的儲存單元中,結點之間的邏輯關係由儲存單元的鄰接關係來體現。檢視具體.

順序表的儲存示意圖

在這裡插入圖片描述

程式碼操作

初始化線性表

//初始化連結串列
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;
    }
}