今天学习的内容比较多,函数的互相调用,指针的巧用,都是学习中的难点,下面是以代码为基础的自我复习与检查。希望可以互相学习共同进步‘。顺序表的逻辑没有学习难度,难的是缜密的思维以及清晰地思路保持。需要考虑每一种可能,也不能忽略每一种数据类型的转换或者定义。
1.线性表的定义
定义n个数据元素的有限序列,记作(a1, a2, …, an)ai 是表中数据元素,n 是表长度
2.线性表的特点
除第一个元素外,其他每一个元素有一个且仅有一个 直接前驱。
除最后一个元素外其他每一个元素有一个且仅有一个 直接后继。
3.顺序表的定义和特点
定义 将线性表中的元素相继存放在一个连续的存储空间中。
可利用一维数组描述存储结构 特点 线性表的顺序存储方式 遍历 顺序访问, 可以随机存取
/*****************************************************
> File name: work3.c
> Author: Li Shang
> 日期: 2018-08-01 15:33
*****************************************************/#include
#include
#define TRUE 1 //宏定义不用加“;”
#define FALSE 0int 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;}