跳表

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define High 10

//int seed = 0;

FILE *fp;

typedef struct Build {
int element;
struct Build *next[High];
}Building;

Building *Create();
Building *Search(Building *Head, int element, int *count);
void Insert(Building *Head, int element);
int CreateHigh();
void Read(Building *Head);
void Print(Building *Head);
void Delete(Building *Head, int element);//Delete之前要查找是否有这个数;
int Menu();

int main()
{
int element;
int count;
int choice;
Building *building;
Building *head;
head = Create();
//Read(head);//有问题,读的时间太快,产生的随机数相同;
while (1)
{
choice = Menu();
switch (choice)
{
case 1:
printf(“请输入插入的值(-1退出):”);
scanf("%d", &element);
while (element != -1) {
Insert(head, element);
printf(“请输入插入的值(-1退出):”);
scanf("%d", &element);
}
break;
case 2:
printf("\n请输入查找的值(-1退出):");
scanf("%d", &element);
while (element != -1) {
building = Search(head, element, &count);
if (building == NULL)
printf(“没有这个数\n”);
else
printf(“找到:%d 寻找次数:%d\n”, building->element, count);
printf("\n请输入查找的值(-1退出):");
scanf("%d", &element);
}
break;
case 3:
printf(“delete\n”);
scanf("%d", &element);
while (element != -1) {
Delete(head, element);
printf(“请输入删除的值(-1退出):”);
scanf("%d", &element);
}
break;
case 4:
Print(head);
break;
default:
printf(“不合法的输入\n”);
}
}
}

Building *Create()
{
Building *head = (Building *)malloc(sizeof(Building));
head->element = -1;
for (int i = 0; i < High; i++)
{
head->next[i] = NULL;
}
return head;
}
Building *Search(Building *Head, int element, int *count)
{
Building *p = Head;
*count = 0;
for (int i = High-1; i >= 0; i–)
{

	if (p->next[i] != NULL && p->next[i]->element <= element)//如果直到i==0;都没成功就返回NULL
	{
		while (p->next[i] != NULL&&p->next[i]->element <= element)
		{
			(*count)++;
			p = p->next[i];
		}
		if (p->element == element)
			//return p->next[i];//找到!!!
			return p;
		if (i == 0)
			return NULL;
	}
	//else if (p->next[i]->element > element)
	//{
	//	if (i == 0)
	//		return NULL;
	//}
	else if (i == 0)
		return NULL;
	//(*count)++;
}

}
void Insert(Building Head, int element)
{
int count = 1;
Building building = (Building )malloc(sizeof(Building));
building->element = element;
Building p = Head;
//p = Head;
Building q;
if ((q=Search(Head, element,&count)) != NULL)
{
printf("%d已存在,重新输入.\n",q->element);
//exit(0);//直接退出
}
else {
//int high = CreateHigh();
srand(time(NULL));
int high = rand() % High;
for (int i = high; i >= 0; i–)
{
if (p->next[i] == NULL)
{
p->next[i] = building;
building->next[i] = NULL;
}
else if (p->next[i]->element < element)
{
while (p->next[i] != NULL&&p->next[i]->element < element)
{
p = p->next[i];
}
//if (p->next[i] == NULL)
//if(p->next[i]->element>element)
building->next[i] = p->next[i];
p->next[i] = building;
}
else if (p->next[i] > element)
{
building->next[i] = p->next[i];
p->next[i] = building;
}
}
}
}
int CreateHigh()
{
// int k = 0;
srand(time(NULL));
// srand(seed);
// for (int j = 0; j < 100; j++)
// for (int t = 0; j < 100; j++)
// k += 3;
int t = rand() % High;
// seed = rand() % (t + 1);
return t;
}
void Read(Building Head)
{
int element;
if ((fp = fopen(“input.txt”, “r”)) == NULL)
{
printf(“can’t open file/n”);
}
else
{
fscanf(fp, “%d”, &element);
while (element != -1)
{
Insert(Head, element);
fscanf(fp, “%d”, &element);
}
}
printf(“读取文件完毕\n”);
fclose(fp);
}
void Print(Building Head)
{
Building p = Head;
for (int i = High-1; i >= 0; i–)
{
p = Head;
printf("%d", p->element);
while (p->next[i] != NULL)
{
p = p->next[i];
printf(" -> %d", p->element);
}
printf(" -> NULL\n");
}
}
void Delete(Building Head, int element)
{
Building p = Head;
for (int i = High - 1; i >= 0; i–)
{
if (p->next[i] != NULL && p->next[i]->element <= element)//如果直到i==0;都没成功就返回NULL
{
while (p->next[i] != NULL&&p->next[i]->element < element)
{
p = p->next[i];
}
if (p->next[i]->element == element)
{
p->next[i] = p->next[i]->next[i];
}
}
}
}
int Menu()
{
int choice;
printf("
********************************\n");
printf(“1.插入 2.查找 3.删除\n”);
printf(“4.打印\n”);
printf("******************************************\n");
printf(“请输入选择的功能:”);
scanf("%d", &choice);
return choice;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 PostgreSQL 数据库中,并没有内置的跳表(Skip List)索引实现。PostgreSQL 提供了多种索引类型,如B树索引、哈希索引、GiST索引和GIN索引等,但没有直接支持跳表的索引类型。 B树索引是 PostgreSQL 中最常用的索引类型之一。它适用于范围查询和等值查询,并且可以保持数据有序性。B树索引在处理数据块的平衡性和查询效率方面具有很好的性能。 除了B树索引之外,PostgreSQL 还提供了其他类型的索引用于特定的场景。例如,哈希索引适用于等值查询,可以提供快速的哈希查找;GiST 索引(通用搜索树)和 GIN 索引(通用倒排索引)适用于全文搜索和复杂的匹配查询。 虽然 PostgreSQL 不提供内置的跳表索引实现,但是你可以使用扩展或自定义索引实现跳表的功能。通过编写自定义插件或使用第三方扩展,你可以在 PostgreSQL 中实现跳表索引。这需要一定的开发工作,并且需要充分测试和评估性能。 需要注意的是,自定义实现的跳表索引可能会受到 PostgreSQL 内核版本更新的影响,并且可能无法享受到 PostgreSQL 内置索引的一些优化和支持。 总之,PostgreSQL 并没有内置的跳表索引实现,但提供了其他类型的索引,如B树索引、哈希索引、GiST索引和GIN索引等,用于满足不同的查询需求。如果需要使用跳表索引,你可以考虑自定义实现或使用第三方扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值