线性表的顺序存储结构
题目:
创建一个线性表,进行判空、判满、增(头增)、删(指定位置删)、改(指定位置改)、查、清空、销毁等操作(参考《大话数据结构》)
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
typedef struct list// 重命名结构体
{
int data[SIZE];//数组存储数据元素,SIZE为最大值
int length;//实际长度
}list_t;
//创建
list_t * creat_list(int size)
{
list_t * list = malloc(sizeof(list_t)); //申请堆区空间
if(list == NULL)
{
printf("空间申请失败!\n");
return NULL;
}
list->length = 0; //空表初始化,实际长度为0
return list; //返回堆区申请的首地址
}
//判空
int isnull(list_t *list)
{
if(list->length == 0)
{
printf("表为空!\n");
return 1;
}
else
return 0;
}
//判满
int isfull(list_t * list)
{
if(list->length == SIZE)
{
printf("表已满!\n");
return 1;
}
else
return 0;
}
//从表头增加数据
int add_head(list_t * list,int data)
{
if(isfull(list))//判满,表满无法进行增加数据操作
{
printf("表已满,无法进行头增操作!\n");
return -1;
}
int i;
for(i = list->length; i >= 0; i--) //挪动数据,从表尾开始挪
{
list->data[i+1] = list->data[i]; //将数值赋给后一个
}
list->data[0] = data; //表头增加新值
list->length++;
return 0;
}
//指定位置插入
int insert_list(list_t * list, int address,int data)
{
if(isfull(list))//判满,同头增
{
printf("表已满,无法进行插入操作!\n");
return -1;
}
if(address > list->length || address < 0)
{
printf("插入位置错误,无法进行插入操作\n");
return -1;
}
int i;
if(address < list->length) //如果数据不在表尾
{
for(i = list->length-1; i>= address-1; i--)
{
list->data[i+1] = list->data[i];
}
}
list->data[address-1] = data; //插入数据
list->length++;//修改实际长度
return 0;
}
//指定位置删除
int delete_list(list_t * list,int address)
{
if(isnull(list))//判空
{
printf("表为空,无法进行删除操作\n");
return -1;
}
if(address > list->length || address < 0) //判断位置
{
printf("删除位置错误,无法进行删除操作\n");
return -1;
}
int i;
if(addressb < list->length)//如果数据不在表尾
{
for(i = address; i < list->length; i++ )
{
list->data[i-1] = list->data[i]; //将删除数据后的数据前移
}
}
list->length--;//修改实际长度
return 0;
}
//查找指定数据
int find_list(list_t * list,int data)
{
if(isnull(list))//判空
{
printf("表为空,无法进行插入操作\n");
return -1;
}
int i,flag,count;
flag = 0;
for(i = 0; i<= list->length-1; i++)
{
if(list->data[i] == data) //找到
{
flag = 1;
count = i;
}
}
if(flag)
printf("数据在第%d的位置\n",count+1);
else
printf("无此数据!\n");
return 0;
}
//打印
int print_list(list_t * list)
{
int i;
if(isnull(list))//判空
{
printf("表为空\n");
return 0;
}
for(i = 0; i < list->length; i++)
{
printf("%d",list->data[i]);
}
printf("\n");
return 0;
}
//清空
int clean_list(list_t * list)
{
list->length = 0;
return 0;
}
//销毁
int dis_list(list_t* list)
{
free(list);
}
int main(int argc, const char *argv[])
{
list_t * list = creat_list(20); //调用创建函数
if(list == NULL)
{
printf("执行错误!\n");
return -1;
}
int i,data;
for(i = 0; i < 10; i++)
{
data = 10*i;
add_head(list,data);//调用头增函数
}
print_list(list); //打印
insert_list(list,3,100);//指定位置插入
print_list(list); //打印
delete_list(list,3); //指定位置删除
print_list(list);
find_list(list,30); //查找指定数据
clean_list(list); //清空数据
print_list(list);
dis_list(list); //销毁
return 0;
}
运行结果如下: