第二章-线性表-顺序表(初始化、循环、插入、删除、查找、清空)

常见的定义和方法都在笔记本上

易错点:

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;
}