线性表之顺序表(C语言版)

线性表之顺序表(C++版)http://t.csdn.cn/pEmnl

seqlist.h文件包含结构体的定义,函数的声明

#pragma once
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#define Initsel 8
#define INC_SIZE 8
typedef int ElemType;//代表当前元素的类型,方便修改
typedef struct SeqList
{
	ElemType* base;//指向一个表,内容
	int capacity;//容量
	int size;//大小
}SeqList;
void InitSeqList(SeqList* list);//初始化
void push_back(SeqList *list,ElemType val);//尾插
void Show(SeqList* list);//显示
void push_front(SeqList* list, ElemType val);//头插
void pop_back(SeqList *list);//尾删
void pop_front(SeqList* list);//头删
void inser_pos(SeqList* list, int val,int pos);//按位置插入
int find(SeqList* list, int val);//按值查找
int length(SeqList* list);//长度
void delete_pos(SeqList* list, int pos);//按位置删除
int delete_val(SeqList* list, int val);//按值删除
void sort(SeqList* list);//排序
void reverse(SeqList* list);//逆序
void swap(int& a, int& b);//交换函数
void clear(SeqList* list);//清空
void destroy(SeqList* list);//销毁
bool Inc(SeqList* list);//增加空间

list.cpp文件,顺序表的初始化以及函数实现

#include"seqlist.h"

//初始化
void InitSeqList(SeqList* list)
{
	list->base = (ElemType*)malloc(sizeof(ElemType) * Initsel);
	assert(list->base != NULL);
	list->capacity = Initsel;
	list->size = 0;
}

//增加空间
bool Inc(SeqList* list)
{
	ElemType *newbase  = (ElemType*)realloc(list->base, sizeof(ElemType) * list->capacity+INC_SIZE);
	if (newbase == NULL)
	{
		printf("增容失败\n");
		return false;
	}
	list->base = newbase;
	list->capacity += INC_SIZE;
	return true;
}

//尾插
void push_back(SeqList* list, ElemType val)
{
	if (list->size >= list->capacity&& !Inc(list))
	{
		printf("顺序表满了,不能尾插\n");
		return;
	}
	list->base[list->size] = val;
	list->size++;

}

//头插
void push_front(SeqList* list, ElemType val)
{
	if (list->size >= list->capacity && !Inc(list))
	{
		printf("顺序表满了,不能头插\n");
		return;
	}
	for (int i = list->size; i > 0; --i)
	{
		list->base[i] = list->base[i - 1];
	}
	list->base[0] = val;
	list->size++;
}

//显示
void Show(SeqList* list)
{
	assert(list != NULL);
	for (int i = 0; i < list->size; i++)
	{
		printf("%d ", list->base[i]);
	}
	printf("\n");
}

//尾删
void pop_back(SeqList* list)
{
	assert(list != NULL);
	list->size--;
}

//头删
void pop_front(SeqList* list)
{
	//把后面的数据移到前面
	for (int i = 1; i < list->size; ++i)
	{
		list->base[i - 1] = list->base[i];
	}
	list->size--;
}

//随机插入一个数
void inser_pos(SeqList* list, int val, int pos)
{
	//判断位置是否合法
	if (pos<0 || pos>list->size)return;
	if (list->size == list->capacity && !Inc(list))
	{
		return;
	}
	for (int i = list->size; i > pos; --i)
	{
		list->base[i] = list->base[i - 1];
	}
	list->base[pos] = val;
	list->size++;
}

//按值查找
int find(SeqList* list, int val)
{
	if (list->size == 0)return -1;
	for (int i = 0; i < list->size; ++i)
	{
		if (list->base[i] == val) return i;
	}
	return -1;
}

//长度
int length(SeqList* list)
{
	return list->size;
}

//按位置删除
void delete_pos(SeqList* list, int pos)
{
	if (pos<0||pos >= list->size)return ;
	for (int i = pos; i < list->size-1; i++)
	{
		list->base[i] = list->base[i + 1];
	}
	list->size--;
}

//按值删除
int delete_val(SeqList* list, int val)
{
	int pos = find(list, val);
	if (pos == -1)
		return -1;
	delete_pos(list, pos);
}

//排序
void sort(SeqList* list)//从小到大
{
	for (int i =0; i <list->size-1; ++i)
	{
		for (int j = 0; j < list->size-i-1; j++)
		{
			if (list->base[j] > list->base[j + 1])
			{
				swap(list->base[j], list->base[j + 1]);
			}
		}
	}
}

//逆序
void reverse(SeqList* list)
{
	int tmp = 0;
	int left = 0; int right = list->size - 1;
	while (left < right)
	{
		swap(list->base[left], list->base[right]);
		left++;
		right--;
	}
}

//交换函数
void swap(int &a, int &b)
{
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}

//清空
void clear(SeqList* list)
{
	list->size = 0;
}

//销毁(与清空区别在于销毁要释放空间
void destroy(SeqList* list)
{
	free(list->base);
	list->base = NULL;
	list->capacity = 0;
	list->size = 0;
}

test.cpp测试代码

#include"seqlist.h"

int main()
{
	SeqList list;
	int select = 1;
	InitSeqList(&list);
	while (1)
	{
		printf("**********************************\n");
		printf("*[1] init         [2]push_back   *\n");
		printf("*[3] show         [4]push_front  *\n");
		printf("*[5] pop_back     [6]inser_pos   *\n");
		printf("*[7] find         [8]length      *\n");
		printf("*[9] delete_pos   [10]delete_val *\n");
		printf("*[11] sort        [12]reverse    *\n");
		printf("*[13]pop_front    [14]clear      *\n");
		printf("*[0] quit_system  [15]destroy    *\n");
		printf("**********************************\n");
		printf("请输入选项:");
		scanf_s("%d",&select);
		int val = 0;//值
		int pos = 0;//位置 
		if (select == 0)
			break;
		switch (select)
		{
		case 1:
			InitSeqList(&list);
			break;
		case 2:
			printf("请输入要插入的数,以-1结束:\n");
			while (scanf_s("%d", &val),val != -1)
			{
				push_back(&list, val);//尾插
			}
			break;
		case 3:
			Show(&list);
			break;
		case 4:
			printf("请输入要插入的数,以-1结束:\n");
			while (scanf_s("%d", &val), val != -1)
			{
				push_front(&list, val);//头插
			}
			break;
		case 5:
			pop_back(&list);//尾删
			break;
		case 6:
			printf("请输入插入的数据及位置:");
			scanf_s("%d %d", &val, &pos);
			inser_pos(&list,val,pos);
			break;
		case 7:
			printf("请输入查找的数据:");
			scanf_s("%d", &val);
			pos = find(&list, val);
			if (pos== -1)//按值查找
			{
				printf("%d没有找到\n",val);
			}
			else
			{
				printf("%d找到了,下标为%d\n",val,pos);
			}
			break;
		case 8:
			pos= length(&list);//长度
			printf("顺序表的长度为%d\n", list.size);
			break;
		case 9:
			printf("请输入删除的位置:");
			scanf_s("%d", &pos);
			delete_pos(&list,pos);//按位置删除
			break;
		case 10:
			printf("请输入要删的值:");
			scanf_s("%d", &val);
			delete_val(&list,val);//按值删除
			break;
		case 11:
			sort(&list);//排序
			break;
		case 12:
			reverse(&list);//逆序
			break;
		case 13:
			pop_front(&list);//头删
			break;
		case 14:
			clear(&list);//清空
			break;
		case 15:
			destroy(&list);//销毁
			break;
		default:
			printf("输入错误,请重新输入:\n");
			break;
		}
	}
	destroy(&list);//销毁
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值