数据结构 顺序表实现详解

顺序表

main函数,测试代码

#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
#include <stdbool.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 

void showmenu(void)
{
	printf("1.插入元素\n");
	printf("2.删除元素\n");
	printf("3.获取元素\n");
	printf("4.元素个数\n");
	printf("5.遍历\n");
	printf("0.销毁\n");
}

void print(int num)
{
	printf("%d",num);
}
void test(void)
{
	size_t cap = 0;
	seqlist seq;
	printf("请输入容量\n");
	scanf("%u",&cap);
	int ret = seq_list_init(&seq,cap);
	if(ret == 0)
	{
		printf("成功\n");
	}
	else
	{
		printf("失败\n");
		return;
	} 
//	return;
	size_t pos = 0;
	int element = 0;
	while(true)
	{
		showmenu();
		int opt = 0;
		scanf("%d",&opt);
		switch(opt)
		{
		
			case 0:
				seq_list_destroy(&seq);
				printf("over\n");
				return;
			case 1:
				printf("插入的位置\n");
				scanf("%d",&pos);
				printf("插入的元素\n");
				scanf("%d",&element);
				ret = seq_list_insert(&seq,pos,element);
				if(ret == 0)
				{
					printf("插入成功\n");
				}
				else
				{
					printf("插入失败\n");
				}
				break;
			case 2:
				printf("删除\n");
				scanf("%u",&pos);
				ret = seq_list_delete(&seq,pos,&element);
				break;
			case 3:
				printf("位置\n");
				 scanf("%d",&pos);
				 ret = seq_list_get(&seq,pos,&element);
				 printf("成功\n");
				 printf("%d\n",element);
				 break;
			case 4:
				 	printf("顺序表中的元素个数为:%u\n",seq_list_size(&seq));
				 	break;
			case 5:
				//printf("-------");
					seq_list_travel(&seq,print);
					printf("\n");
					break;
		}
	}
		 	
} 



int main(int argc, char *argv[]) {
	test();
	return 0;
}

头文件

#ifndef SEQLIST_H__
#define SEQLIST_H__
#include <stdbool.h> 
#include <stdlib.h>
typedef struct seqlist
{
	int *data;   //指向具体存储元素的地址 
	size_t size;//存储元素的个数 
	size_t cap;//当前最大容量 
}seqlist;

//初始化顺序表容量位cap大小 
int seq_list_init(struct seqlist *seqlist,size_t cap);
//seqlist->data = malloc(sizeof(int)*cap)
//seqlist->size = 0;
//seqlist->cap = cap; 
//销毁一个顺序表 
void seq_list_destroy(struct seqlist *seqlist);
//判断顺序表是否为空 
bool seq_list_is_empty(struct seqlist *seqlist);
//删除最后一个元素 
int seq_list_delete_last(struct seqlist *seqlist,int element);
//在顺序表末尾增加一个元素 
int seq_list_push_back(struct seqlist *seqlist,int element); 
//获取当前元素个数 
size_t seq_list_size(struct seqlist *seqlist); 

//在指定位置pos插入一个元素pos 
int seq_list_insert(struct seqlist *seqlist,size_t pos,int element); 

//删除指定位置的元素
int seq_list_delete(struct seqlist *seqlist,size_t pos,int *pelement); 

//函数的返回值表示成功or失败 pelement用于接收结果
int seq_list_get(struct seqlist *seqlist,size_t pos,int *pelement); 

//遍历
void seq_list_travel(struct seqlist *seqlist,void (*travel)(int));

#endif //SEQLIST_H__

实现函数.c

#include "seqlist.h"

//初始化顺序表 
int seq_list_init(struct seqlist *seqlist,size_t cap)
{
	seqlist->data = malloc(sizeof(int)*cap);
	if(seqlist->data == NULL)
	{
		return -1; 
	}
	seqlist->size = 0;
	seqlist->cap = cap;
	return 0;
}

//销毁一个顺序表 
void seq_list_destroy(struct seqlist *seqlist)
{
	if(seqlist->data != NULL)
	{
		free(seqlist->data);	
	}
	seqlist->data = NULL;
}
//获取当前元素个数 
size_t seq_list_size(struct seqlist *seqlist)
{
	return seqlist->size;
} 

//在指定位置pos插入一个元素element
int seq_list_insert(struct seqlist *seqlist,size_t pos,int element)
{
	if(pos > seqlist->size)
	{
		return -1;
	}
	if(seqlist->size > seqlist->cap)//顺序表目前已满 
	{
		seqlist->cap *= 2;//万一内存不够进行扩容 
		seqlist->data = realloc(seqlist->data,sizeof(int)*seqlist->cap);
		if(seqlist->data == NULL)
		{
			return -2;
		}
	}
	size_t i;
	for(i = seqlist->size;i>=pos+1;i--)
	{
		seqlist->data[i] = seqlist->data[i-1];
	}
	seqlist->data[pos] = element; 
	seqlist->size++;
	return 0;
}

//删除指定位置的元素
int seq_list_delete(struct seqlist *seqlist,size_t pos,int *pelement)
{
	if(pos >= seqlist->size)//删除的时候最后一个元素必须存在 
	{
		return -1;
	}
	*pelement = seqlist->data[pos];
	size_t i;
	for(i = pos;i<seqlist->size-1;i++)
	{
		seqlist->data[i] = seqlist->data[i+1];
	}
	seqlist->size--;
	return 0;
	
} 

//函数的返回值表示成功or失败 pelement用于接收结果
int seq_list_get(struct seqlist *seqlist,size_t pos,int *pelement)
{
		if(pos >= seqlist->size)
		{
			return -1;
		}
		*pelement = seqlist->data[pos];
		return 0;
} 

//遍历
void seq_list_travel(struct seqlist *seqlist,void (*travel)(int))
{
	size_t i;
	for(i = 0;i<seqlist->size;i++)
	{
		travel(seqlist->data[i]);
	}
}

//判断顺序表是否为空 
bool seq_list_is_empty(struct seqlist *seqlist)
{
	return seqlist->size == 0;
} 
//在顺序表末尾增加一个元素 
int seq_list_push_back(struct seqlist *seqlist,int element)
{
	return seq_list_insert(seqlist,seqlist->size,element);//复用了插入的那个函数 
}
//删除最后一个元素 
int seq_list_delete_last(struct seqlist *seqlist,int element)
{
	if(seqlist->size == 0)
	{
		return -1;
	}
	element = seqlist->data[--seqlist->size];//没有擦除内存seqlist->data[seqlist->size]
	return 0; 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HOVL_C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值