第二章-線性表-順序表(初始化、循環、插入、刪除、查找、清空)

常見的定義和方法都在筆記型電腦上

易錯點:

1.插入、刪除判斷條件不熟悉,經常忘記

2.這六種創建struct、初始化、銷毀、清空功能分不太清

3.裡面如何表示,有些細節還不太清楚

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 9
#define OK 1
#define Size 5

typedef int ElemType;
typedef int Status;

typedef struct Table{
    ElemType *head;
    int length;
    int size;
}table;

//初始化
table init_table();
//循環遍曆數組
void forEach_table(table t);
//插入元素節點
table add_table(table t,int index,int val);
//刪除元素節點
table del_table(table t,int index);
//查詢元素節點
int find_table(table t,int val);
//清空線性表
table clear_table(table t);


int main() {
    table t1= init_table();
    for(int i=0;i<Size;i++){
        t1.head[i]=i+1;
        t1.length++;
    }
    //printf("t1.length====%d\n",t1.length);//t1.length表達的是head里元素有幾個
    //printf("t1.dizhi===%p\n",&t1.length);//&t1.length表達的是存儲這個長度所在的地址

    //TIPS:   t1.head[t1.length]=t1.head[5],這裡t1.length==5,只是一個數字,在順序隊列中,結構體中int了兩個下標,當作所引用
    //printf("%p\n",t1.head[t1.length]);
    //printf("t1.head[5]====%p\n",t1.head[5]);

    t1=add_table(t1,2,666);

    t1=del_table(t1,3);

    int findVal=find_table(t1,666);
    // printf("%d\n",findVal);

    t1=clear_table(t1);


    forEach_table(t1);


    return 0;
}

table init_table(){
    table t;
    t.head=(ElemType*)malloc(sizeof(ElemType)*MAXSIZE);
    if(!t.head)
        exit(0);//申請記憶體不足,初始化失敗
    t.length=0;
    t.size=MAXSIZE;
    return t;
}

void forEach_table(table t){
    if(!t.head)
        exit(0);
    for(int i=0;i<t.length;i++){
        printf("%d ",t.head[i]);//取t.head各個元素的值
        // printf("%p\n",&t.head[i]);//取t.head各個元素的地址,注意是t的,和上面的t1地址是不同的
    }
}

table add_table(table t,int index,int val){
    if(t.length>=t.size){
        printf("順序表已滿");
        exit(0);
    }
    if(index>t.length+1 || index<1){
        printf("位置不合法");
        exit(0);
    }
    //TIPS:  注意這裡的判斷關係
    for(int i=t.length-1;i>=index-1;i--){
        t.head[i+1]=t.head[i];
    }
    t.head[index-1]=val;
    t.length++;

    return t;
}

table del_table(table t,int index){
    if(!t.head){
        printf("空順序表");
        exit(0);
    }
    if(index>t.length || index<1){
        printf("刪除位置有問題");
    }
    for(int i=index;i<t.length;i++){
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}

int find_table(table t,int val){
    if(!t.head){
        printf("空表");
        exit(0);
    }
    for(int i=1;i<t.length;i++){
        if(t.head[i-1]==val){
           return i;
        }
    }
}

table clear_table(table t){
 
    //TIPS:  這樣設定後,只能表示t.length是不準的,為0,但是t.head中其他元素還是都在的
    //還有銷毀線性表也沒有搞懂,最好橫向對比這六種方法都如何初始化和銷毀清空
    t.length=0;

    return t;
}