存储结构/物理结构:逻辑结构在计算机的存储形式
1.顺序存储:使用一段任意的连续的存储空间存储数据元素【数组】
逻辑相邻,物理也相邻
2.链式存储:使用任意一块空间存储数据元素【银行取钱】
逻辑相邻,物理不一定相邻
3.散列存储:哈希存储,哈希表,计算机的存储位置个关键字有一定的对 应关系。
哈希表主要的作用实现查找
4.索引存储:由索引表和数据文件组合实现的一种查找方式
head.h
#ifndef __A_H__
#define __A_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datedef;
#define MAX 10
typedef struct // 创建顺序表结构
{
datedef date[MAX];
int len;
} Seqlist, *seqlist;
typedef struct // 创建顺序表结构
{
datedef date[MAX * 2];
int len;
} Seqlist1, *seqlist1;
seqlist creat(); // 创建顺序表
seqlist1 creat1(); // 创建顺序表
int pE(seqlist list); // 判空
int pM(seqlist list); // 判满
int pE1(seqlist1 list); // 判空
int insert(seqlist list, int q); // 尾插
int output(seqlist list); // 输出
int output1(seqlist1 list); // 输出
int del(seqlist list); // 尾删
int search(seqlist list, int n); // 查找
int update(seqlist list, int w, datedef e); // 修改
int mid_s(seqlist list, int n, datedef e); // 中间插入(前置)
int mid_del(seqlist list, int n); // 中间删除
int p_search(seqlist list, datedef e); // 位置查找
int p_del(seqlist list, datedef e); // 元素删除
int p_update(seqlist list, datedef a, datedef e); // 元素修改
int p_dd(seqlist list); // 元素去重
int p_insert(seqlist list, datedef a, datedef e); // 某元素后插入
int bubble(seqlist list); // 排序
void toget(seqlist a, seqlist b, seqlist1 c); // 有序表排序
typedef int datedef;
#endif
fun.c
#include "head.h"
seqlist creat() // 创建顺序表
{
seqlist list = (seqlist)malloc(sizeof(Seqlist));
if (list == NULL)
return NULL;
list->len = 0;
return list;
}
seqlist1 creat1() // 创建顺序表
{
seqlist1 list1 = (seqlist1)malloc(sizeof(Seqlist1));
if (list1 == NULL)
return NULL;
list1->len = 0;
return list1;
}
int pE(seqlist list) // 判空
{
return list->len == 0 ? -1 : 0;
}
int pE1(seqlist1 list) // 判空
{
return list->len == 0 ? -1 : 0;
}
int pM(seqlist list) // 判满
{
return list->len >= MAX ? -1 : 0;
}
int insert(seqlist list, int q) // 尾插
{
if (list == NULL || pM(list))
{
printf("创建失败!\n");
return -1;
}
list->date[list->len] = q;
list->len++;
}
int output(seqlist list) // 输出
{
if (list == NULL || pE(list))
{
printf("输出失败!\n");
return -1;
}
for (int i = 0; i < list->len; i++)
{
printf("date[%d]=%d\t", i + 1, list->date[i]);
}
puts("");
}
int output1(seqlist1 list) // 输出
{
if (list == NULL || pE1(list))
{
printf("输出失败!\n");
return -1;
}
for (int i = 0; i < list->len; i++)
{
printf("c[%d]=%d\t", i + 1, list->date[i]);
}
puts("");
}
int del(seqlist list) // 尾删
{
if (list == NULL || pE(list))
return -1;
list->len--;
}
int search(seqlist list, int n) // 查找
{
if (list == NULL || pE(list) || n < 1 || n > list->len)
{
printf("查找失败!\n");
return -1;
}
printf("查找到元素为:%d\n", list->date[n - 1]);
}
int update(seqlist list, int n, datedef e) // 修改
{
if (list == NULL || pE(list) || n < 1 || n > list->len)
{
printf("操作失败!\n");
return -1;
}
list->date[n - 1] = e;
}
int mid_s(seqlist list, int n, datedef e) // 中间插入
{
if (list == NULL || pM(list) || n < 1 || n > list->len + 1)
{
printf("操作失败!\n");
return -1;
}
for (int i = list->len; i > n - 1; i--)
{
list->date[i] = list->date[i - 1];
}
list->date[n - 1] = e;
list->len++;
}
int mid_del(seqlist list, int n) // 中间删除
{
if (list == NULL || pE(list) || n < 1 || n > list->len + 1)
{
printf("操作失败!\n");
return -1;
}
for (int i = n - 1; i < list->len; i++)
{
list->date[i] = list->date[i + 1];
}
list->len--;
return 0;
}
int p_search(seqlist list, datedef e) // 位置查找
{
if (list == NULL || pE(list))
{
printf("顺序表不存在。\n");
return -1;
}
int b = 0;
for (int i = 0; i < list->len; i++)
{
if (list->date[i] == e)
{
b = i + 1;
return b;
break;
}
}
if (b > list->len)
return -1;
}
int p_del(seqlist list, datedef e) // 元素删除
{
int n = p_search(list, e);
mid_del(list, n);
printf("操作完成\n");
return 0;
}
int p_update(seqlist list, datedef a, datedef e) // 元素修改
{
int n = p_search(list, a);
update(list, n, e); // 修改
printf("操作完成\n");
return 0;
}
int p_dd(seqlist list) // 元素去重
{
if (list == NULL || pE(list))
{
printf("操作失败\n");
return -1;
}
for (int i = 0; i < list->len - 1; i++)
{
for (int j = i + 1; j < list->len; j++)
{
if (list->date[i] == list->date[j])
{
mid_del(list, j + 1); // 中间删除
j--;
}
}
}
printf("操作完成\n");
return 0;
}
int p_insert(seqlist list, datedef a, datedef e) // 某元素后插入
{
int n = p_search(list, a);
if (n == -1)
{
printf("没有该元素\n");
return -1;
}
mid_s(list, n + 1, e); // 中间插入
printf("操作完成\n");
return 0;
}
int bubble(seqlist list) // 排序
{
if (list == NULL || pE(list))
{
printf("操作失败\n");
return -1;
}
for (int i = 1; i < list->len; i++)
{
int count = 0;
for (int j = 0; j < list->len - i; j++)
{
if (list->date[j + 1] < list->date[j])
{
datedef k = list->date[j];
list->date[j] = list->date[j + 1];
list->date[j + 1] = k;
count++;
}
}
if (count == 0)
break;
}
printf("操作完成\n");
return 0;
}
void toget(seqlist a, seqlist b, seqlist1 c) // 有序表排序
{
int i = 0, j = 0;
while (i < a->len && j < b->len && !pE(a) && !pE(b))
{
if (a->date[i] <= b->date[j])
{
c->date[c->len] = a->date[i];
i++;
c->len++;
}
else if (a->date[i] > b->date[j])
{
c->date[c->len] = b->date[j];
j++;
c->len++;
}
}
while (i < a->len || j < b->len)
{
if (j < b->len)
{
c->date[c->len] = b->date[j];
j++;
c->len++;
}
else if (i < a->len)
{
c->date[c->len] = a->date[i];
i++;
c->len++;
}
}
}
main.c
#include "head.h"
int main()
{
seqlist list = creat();
int n;
datedef e;
printf("输入元素个数:");
scanf("%d", &n);
if (n > MAX)
n = MAX;
for (int i = 0; i < n; i++)
{
printf("要输入的元素是:");
scanf("%d", &e);
insert(list, e);
}
output(list);
/*
del(list);
output(list);
printf("你要查找的元素是第几个?");
scanf("%d",&n);
search(list,n);
printf("你要修改的元素是第几个?");
scanf("%d",&n);
printf("你要将该元素改为:");
scanf("%d",&e);
update(list,n,e);
output(list);
printf("你要在第几个位置插入?");
scanf("%d",&n);
printf("你要将该元素改为:");
scanf("%d",&e);
mid_s(list,n,e); //中间插入(前置)
output(list);
printf("你要删除的元素是第几个?");
scanf("%d",&n);
mid_del(list,n); //中间删除
output(list);
printf("你要查找的元素为:");
scanf("%d",&e);
n=p_search(list,e); //位置查找
if(!n)
{
printf("该元素不存在\n");
}
else if(n!=-1)
{
printf("该元素在第%d个。\n",n);
}
*/
/*
printf("你要删除的元素为:");
scanf("%d",&e);
p_del(list,e); //元素删除
output(list);
*/
/*
datedef a;
printf("你要修改的元素为:");
scanf("%d",&a);
printf("你要将该元素改为:");
scanf("%d",&e);
p_update(list,a,e); //元素修改
output(list);
p_dd(list); //元素去重
output(list);
*/
datedef a;
printf("你要插入的前一个元素为:");
scanf("%d", &a);
printf("你要插入的元素为:");
scanf("%d", &e);
p_insert(list, a, e); // 元素前插入
output(list);
bubble(list); // 排序
output(list);
seqlist list1 = creat();
printf("输入元素个数:");
scanf("%d", &n);
if (n > MAX)
n = MAX;
for (int i = 0; i < n; i++)
{
printf("要输入的元素是:");
scanf("%d", &e);
insert(list1, e);
}
bubble(list1); // 排序
output(list1);
seqlist1 c = creat1();
toget(list, list1, c);
output1(c);
free(list);
list = NULL;
free(list1);
list1 = NULL;
free(c);
c = NULL;
return 0;
}