C语言学习(十)顺序表

 今天学习的内容比较多,函数的互相调用,指针的巧用,都是学习中的难点,下面是以代码为基础的自我复习与检查。希望可以互相学习共同进步‘。顺序表的逻辑没有学习难度,难的是缜密的思维以及清晰地思路保持。需要考虑每一种可能,也不能忽略每一种数据类型的转换或者定义。

1.线性表的定义    

定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度

2.线性表的特点    

除第一个元素外,其他每一个元素有一个且仅有一个     直接前驱。    

除最后一个元素外其他每一个元素有一个且仅有一个     直接后继。

3.顺序表的定义和特点

定义  将线性表中的元素相继存放在一个连续的存储空间中。          

可利用一维数组描述存储结构 特点   线性表的顺序存储方式 遍历   顺序访问, 可以随机存取

/*****************************************************
    > File name: work3.c
    > Author: Li Shang
    > 日期: 2018-08-01 15:33
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1      //宏定义不用加“;”
#define FALSE 0

int MAX = 10;

typedef int Elementype;//给int 起别名,便于对一系列数据类型修改,如typedef char Elementype

struct List//顺序表结构体
{
    Elementype* head;//顺序表头指针
    int length;//顺序表长度
};

int init(struct List* l);//函数声明,后面逐个介绍
void print(struct List l);
int insert_tail(struct  List* l,Elementype value);
int insert_index(struct List* l,int index,Elementype value);
int detele_index(struct List* l,int index);
int detele_value(struct List* l,Elementype value);
int updata_index(struct List* l,int index,Elementype value);
int query_value(struct List* l,Elementype value);
int empty(struct List* l);

int main()
{
    struct List list;//定义结构体变量list
    int ret;
    ret = init(&list);//接收返回申请结果
    if(ret == FALSE)
    {
        return 1;
    }

    int i;
    for(i = 0;i < 20;i++)
    {
        insert_tail(&list,i);//用尾插函数为顺序表赋值
    }
    print(list);//用自定义的输出函数循环输出顺序表

    insert_index(&list,2,66);
    print(list);
    
    detele_index(&list,2);
    print(list);
    
    insert_index(&list,2,2);
    print(list);
    
    insert_index(&list,2,66);
    print(list);

    updata_index(&list,2,99);
    print(list);

    query_value(&list,2);
    empty(&list);
    return 0;
}

int init(struct List* l)//为顺序表申请内存,并返回申请结果
{
    l -> head = (Elementype*)malloc(MAX*sizeof(Elementype));//malloc申请内存
    if(NULL == l -> head)//判断如果地址为空,则申请失败
    {
        return FALSE;
    } 
    l -> length = 0;//赋值给指针所指向的地址
    return TRUE;
}

void print(struct List l)//打印函数,循环打印顺序表
{
    int i;
    for(i = 0;i < l.length;i++)
    {
        printf("%d ",*(l.head+i) );
    }
    printf("\n");
}

int insert_tail(struct List* l,Elementype value)//尾插函数
{
    if(l -> length == MAX)//判断内存是否够用,如果达到上限则申请
    {
        l -> head = (Elementype*)realloc(l -> head,sizeof(Elementype)*(MAX+MAX/2));//realloc再次申请
        if(NULL == l -> head)//判断申请内存是否成功
        {
            return FALSE;
        }
        MAX += MAX/2;//计算申请后的内存大小
        printf("realloc MAX = %d\n",MAX );//显示申请后的内存大小

    }
    *(l -> head + l -> length) = value;//将值赋给第length,即最后一位后一位
    l -> length++;
    return TRUE;
}

int insert_index(struct List* l,int index,Elementype value)//指定位置插入函数
{
    if(l->length == MAX)//判断内存,不够则申请
    {
        l->head = (Elementype*)realloc(l->head,sizeof(Elementype)*(MAX += MAX/2));
        if(NULL == l->head)//判断申请成功与否
        {
            return FALSE;
        }
        MAX += MAX/2;
        printf("realloc MAX = %d\n",MAX );//显示申请后大小
    }
    if(index < 0 || index >l->length)//判断插入位置是否输入正确
    {
        printf("index is error\n");
        return FALSE;
    }
    int i;
    for(i = l->length - 1;i >= index;i--)//(制造“空位”)循环赋值,将前一位赋给后一位,完成数值整体移动
    {
        *(l->head + i + 1) = *(l->head + i);
    } 
    *(l->head + index) = value;
    l->length++;
    return TRUE;

}

int detele_index(struct List* l,int index)//删除指定位置的数据
{
    if(index < 0 || index > l-> length-1)//判断插入位置是否输入正确
    {
        printf("index is error\n");
        return FALSE;
    }
    int i;
    for(i = index;i < l -> length -1;i++)//用后面的内容一次覆盖前面的内容,完成删除
    {
        *(l -> head +i) = *(l -> head +i +1);
    }
    l->length--;
    return FALSE;
}

int detele_value(struct List* l,Elementype value)
{
    int i;
    for(i = 0;i < l->length;i++)
    {
        if(*(l->head+i) == value)//判断是否是指定内容
        {
            detele_index(l,1);
            i--;//用来判断新的指定内容位置,是否符合要求
        }
    }
    return TRUE;
}

int updata_index(struct List* l,int index,Elementype value)
{
    if(index < 0 || index > l-> length-1)
    {
        
        printf("index is error\n");
        return TRUE;
    }
    *(l -> head +index) = value;//将指定位置的内容用给定的内容覆盖
    return TRUE;
}

int query_value(struct List* l,Elementype value)
{
    printf("querry_value(%d)\n",value );//显示寻找的内容
    int i;
    int flag = 0;
    for(i = 0;i < l->length;i++)
    {
        if(value == *(l->head+i))//判断是否是指定内容
        {
            flag++;//计符合要求的个数
            printf("%d ",i );
        }
    }
    if(flag == 0)//判断没有该值的情况
    {
        printf("no found\n");
        return FALSE;
    }
    printf("\n");
    return TRUE;
}

int empty(struct List* l)//释放内存以及指针
{
    free(l->head);
    l->head = NULL;
    l->length = 10;
    MAX = 10;
    return TRUE;

}
 

猜你喜欢

转载自blog.csdn.net/ls_dashang/article/details/81348495