学习日记--顺序表
顺序表:顺序存诸的线性表。
链式表:链式存诸的线性表,简称链表
顺序存储就是将数据存诸到一片连续的内存中,在C语言环境下,可以是具名的栈数
组,或者是诺名的堆数组。
存诸方式不仅仅只是提供数据的存储空间,而是必须要能体现数据之间的逻辑关系。当
采用顺序存诸的方式来放数据时,唯一能用来表达数据日本身的逻辑关系的就是存储
位置。比如队列中的两人人,小明和小花,如果小明在逻辑上排在相的小花的前面
那么在存储位置上也必须把小实验明存放在相的小花的前面。
实验:创建一个顺序表,并从键盘接收数字输入,将输入的正整数按从小到大的顺序插入顺序表,并在输入负整数的时喉将其绝对值数据除。每次输入后
将顺序表的内容打印至屏幕上
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
/*
创建一个顺序表,并从键盘接收数字输入,将输入的正整数按从小到大的顺
序插入顺序表,并在输入负整数的时候将其绝对值数据删除。每次输入后,
将顺序表的内容打印到屏幕上。
*/
//0、顺序表的结构体
typedef struct
{
int capacity; //顺序表容量
int last; //最末尾的下标
int *data; //顺序表 以整形为例
}Sequence_List;
//1、初始化顺序表
Sequence_List* Sequence_init(int cap_size)
{
//1.给顺序表的结构体申请一个内存空间
Sequence_List *p = malloc(sizeof(Sequence_List));//不能是p 因为这是一个指针 p的话就只能给指针一个4/8的内存空间,不是给结构体
if (p == NULL)
{
printf("申请空间失败!\n");
return (Sequence_List*)-1;
}
//2.给申请的空间进行赋值
if (p != NULL)
{
p->capacity = cap_size; //顺序表的内存空间元素个数
p->data = malloc(cap_size * sizeof(int)); //申请顺序表的内存空间大小(根据存储类型大小来存储) 看类型的情况注意类型的存储//malloc(cap_size * sizeof(int))表示元素个数malloc(cap_size)表示字节
p->last = -1; //现在的顺序表内存空间没有元素所以下标为-1
}
if (p->data == NULL)
{
free(p); //申请(顺序表内存)失败,将之前的申请的内存释放
return NULL;
}
//3.初始化一切顺利,将申请的空间(结构体)的地址返回
return p;
}
//判定是否为空
bool Is_Empty(Sequence_List *p)
{
return p->last == -1; //如果等于-1,说明没有数据 返回true
//如果不等于1,说明有数据 返回false
}
//判定是否为满
bool Is_Full(Sequence_List *p)
{
return p->last == p->capacity -1; //如果等于-1,说明满了 返回true
//如果不等于1,说明没有满 返回false
}
//2、在顺序表表头插入一个新数据
int Sequence_Insert(Sequence_List *p, int a)
{
//1.如果满了就返回-1
if(Is_Full(p))
return -1; //如果满了,返回-1
int j= 0;
//2.将原来的数据向后挪一位
for (j = p->last; j >= 0; j--)
{
p->data[j+1] = p->data[j];
}
//3.将新数据置入表头
p->data[0] = a;
//4.将下标后移一位
p->last++;
return 0; //插入成功,返回0
}
//3、在顺序表表头删除一个新数据
int Sequence_Rmsert(Sequence_List *p, int data)
{
//1.如果空了就返回-1
if(Is_Empty(p))
return -1; //如果空了,返回-1
//2.将原来的数据向前挪一位
//2.将说有数据全部往前挪一位
int i= 0;
for (i = 0; i <= p->last; i++)
{
p->data[i] = p->data[i+1];
}
//3.将下标后移减1
p->last--;
return 0; //删除成功,返回0
}
//4、将顺序表销毁
void Sequence_Destroy(Sequence_List *p)
{
if (p == NULL)
{
return;
}
free(p->data); //先销毁结构体里的顺序表堆内存
p->data = NULL;
free(p); //再销毁结构体
p = NULL;
}
//5、显示顺序表
void Show_List(Sequence_List *p)
{
if(Is_Empty(p))
{
//1.如果空了就返回-1
printf("顺序表为空\n"); //如果空了,返回-1
return;
}
printf("顺序表为:");
for(int i = 0; i <= p->last; i++)
{
printf("%d ",p->data[i]);
}
printf("\n");
}
//6、删除负数的绝对值
int Sequence_Del(Sequence_List *p,int data)
{
//1.如果空了就返回-1
if(Is_Empty(p))
return -1; //如果空了,返回-1
//2.将说有数据全部往前挪一位
data = -data;
for (int i = 0; i <= p->last; i++)
{
if (p->data[i] == data)
{
p->data[i] = p->data[i+1];
//3.将下标后移减1
p->last--;
}
}
return 0; //删除成功,返回0
}
//7、排序
void Sequence_Sort(Sequence_List *p)
{
int t = 0;
int i = 0;
for (i = 0; i < p->last; i++)
{
if (p->data[i] < p->data[i+1])
{
int t = p->data[i];
p->data[i] = p->data[i+1];
p->data[i+1] = t;
}
}
}
//主函数
int main(int argc, char const *argv[])
{
//a、初始化顺序表
Sequence_List *p = Sequence_init(1280);
//b、写入数据
int num = 0;
printf("请输入你要输入的数据(输入0退出):");
while ( scanf("%d",&num) == 1)
{
if (num == 0)
{
printf("输入结束\n");
break;
}
if (num > 0)
{
//c、插入数据
Sequence_Insert(p,num);
//sleep(1);
//d、查看顺序表
Sequence_Sort(p);
Show_List(p);
}
else
{
//e、删除数据
Sequence_Del(p,num);
Show_List(p);
}
}
//、销毁顺序表
Sequence_Destroy(p);
return 0;
}