数据结构 顺序表笔记

/*
顺序表示的线性表——顺序表
定义:线性表是由n个相同类型的数据元素组成的有限序列。线性表的数据
元素具有序偶关系,即数据元素之间具有一定次序。 
线性表按照储存方式可以分成顺序储存和链式储存。线性表的顺序储存是指
将线性表中的元素储存在一组连续的储存单元中。例如数组。 
顺序表的特点有:逻辑上相邻的元素在物理上也是相邻的。线性表的顺序储
存结构是一种随机存取的储存结构。 
*/ 
// 以整型数据储存为例

# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

// 储存结构 
struct arry 
{
    int * p;        // 数组第一个元素地址 
    int len;        // 数组长度 
    int cnt;        // 数组有效数字个数 
};

void Create_Arry(struct arry *);              // 数组的创建 
void Init_Arry(struct arry *);                // 数组的初始化 
void Arry_Input(struct arry *);               // 数组数据的输入
void Show_Arry(struct arry *);                // 数组的遍历
bool Is_Empty(struct arry *);                 // 判断数组是否为空
bool Is_Full(struct arry *);                  // 判断数组是否满 
void Delete_Arry(struct arry *, int);         // 删除数组元素 
void Destory_Arry(struct arry *);             // 数组的销毁 
void Add_Arry(struct arry *, int);            // 追加元素 
void Find_In_Arry(struct arry *, int);        // 在数组中查找某个元素 

int main(void)
{
    struct arry arr;
    // 数组的创建 
    Create_Arry(&arr);
    // 数组的初始化
    Init_Arry(&arr); 
    // 数组数据的输入
    Arry_Input(&arr);
    // 数组遍历
    Show_Arry(&arr);
    
    int pos;
    printf("请输入您想要销毁的元素位置:");
    scanf("%d", &pos);
    Delete_Arry(&arr, pos);
    Show_Arry(&arr);
    
    int val;
    printf("请输入您想要追加的元素的值:");
    scanf("%d", &val);
    Add_Arry(&arr, val);
    Show_Arry(&arr);
    
    int i;
    printf("请输入您想查找的值!\n");
    scanf("%d", &i);
    Find_In_Arry(&arr, i);
    
    Destory_Arry(&arr);
    
    return 0;
} 


// 数组的创建 
void Create_Arry(struct arry * arry)
{
    printf("请输入您需要的数组最大长度:");
    scanf("%d", &arry->len);
    arry->p = (int *)malloc((arry->len) * sizeof(int));
    
    return;
}

// 数组的初始化
void Init_Arry(struct arry * arr)
{
    arr->cnt = 0;
    
    return;
}
 

// 数组数据的输入
void Arry_Input(struct arry * arry)
{
    int cnt;
    printf("请输入您想赋值的元素个数:");
    scanf("%d", &cnt);
    if (cnt > arry->len)
    {
        printf("您需要输入的数值的个数大于数组长度,输入失败!\n");
        exit(-1);
    }
    int i;
    for (i = 0; i < cnt; ++i)
    {
        printf("请输入第%d个数组元素的值:", i+1);
        scanf("%d", &arry->p[i]);
    } 
    arry->cnt = cnt;
    
    return;
}

// 数组的遍历
void Show_Arry(struct arry * arry)
{
    if (Is_Empty(arry))
        printf("数组为空,无数据可输出!\n");
    else
    {
        int i;
        for (i = 0; i < arry->cnt; ++i)
        {
            printf("%d\n", arry->p[i]);
        }
        printf("\n");
    } 
    
    return;
}

// 判断是否为空
bool Is_Empty(struct arry * arry)
{
    if (0 == arry->cnt)
        return true;
    else
        return false;
}

// 判断数组是否满
bool Is_Full(struct arry * arry)
{
    if (arry->cnt == arry->len)
        return true;
    else
        return false;
}

// 销毁数组中某个元素 
void Delete_Arry(struct arry * arry, int pos)
{
    int val;
    if (pos > arry->cnt+1)
    {
        printf("数组中不存在该元素!\n");
        exit(-1);
    }
    val = arry->p[pos-1]; 
    for (int i = pos-1; i < arry->cnt; ++i)
        arry->p[i] = arry->p[i+1];
    
    // 销毁某个元素后,有效数字个数要减一
    arry->cnt -= 1; 
    printf("销毁成功,您销毁的元素是%d\n", val);
    
    return;
} 

// 追加元素 
void Add_Arry(struct arry * arry, int val)
{
    if (Is_Full(arry))
    {
        printf("数组已满,无法再添加元素!\n");
        exit(-1);
    }
    arry->p[arry->cnt] = val;
    arry->cnt += 1;
    
    return;
}

// 在数组中查找某个元素 
void Find_In_Arry(struct arry * arry, int val)
{
    int pos;
    for (pos = 0; pos < arry->cnt; ++pos)
    {
        if (val == arry->p[pos])
            break;
    }
    if (pos = arry->cnt)
    {
        printf("您查找的数值不存在!\n");
        exit(-1);
    }
    else
        printf("您查找的元素在数组的第%d位!\n", pos+1);
    
    return;
}                  

// 数组的销毁 
void Destory_Arry(struct arry * arry)
{
    free(arry->p);
    arry->p = NULL;
    
    return;
}

 

posted @ 2017-04-16 11:52  荒唐了年少  阅读(286)  评论(0编辑  收藏  举报