C语言版本:顺序表的实现
seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__ #include<cstdio>
#include<malloc.h>
#include<assert.h>
#define SEQLIST_INIT_SIZE 8
#define INC_SIZE 3 //空间增量的大小
typedef int ElemType;
typedef struct Seqlist {
ElemType *base;
int capacity; //顺序表容量
int size; //表的大小
}Seqlist; bool Inc(Seqlist *list);//增加顺序表的容量
void InitSeqlist(Seqlist *list); //初始化顺序表
void push_back(Seqlist *list, ElemType x); //在顺序表的末尾插入元素
void push_front(Seqlist *list, ElemType x); //在顺序表的头部插入元素
void show_list(Seqlist *list); //显示顺序表中的元素
void pop_back(Seqlist *list); //删除顺序表最后一个元素
void pop_front(Seqlist *list); //删除顺序表第一个元素
void insert_pos(Seqlist *list, int pos, ElemType x);//在顺序表的选定位置上插入数据
int find(Seqlist *list, ElemType key); //在顺序表中查找元素key的下标
int length(Seqlist *list);//求顺序表的长度
void delete_pos(Seqlist *list, int pos); //删除顺序表中特定位置的数据元素
void delete_val(Seqlist *list, int key);//删除顺序表中值为key的数据元素
void sort(Seqlist *list);//冒泡排序
void reverse(Seqlist *list);//逆置顺序列表
void clear(Seqlist *list);//清除顺序表中的所有元素
void destroy(Seqlist *list);//摧毁顺序表
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb);//合并两个顺序列表 #endif //__SEQLIST_H__
seqlist.cpp
#include"seqlist.h"
bool Inc(Seqlist *list) {
ElemType *newbase = (ElemType*)realloc(list, sizeof(ElemType)*(list->capacity + INC_SIZE)); //重新分配内存空间
if (newbase == NULL) {
printf("内存空间已满,无法再分配内存空间!\n");
return false;
}
list->base = newbase;
list->capacity += INC_SIZE;
return true;
}
void InitSeqlist(Seqlist *list) {
list->base = (ElemType*)malloc(sizeof(ElemType)*SEQLIST_INIT_SIZE);
assert(list->base != NULL);
list->capacity = SEQLIST_INIT_SIZE;
list->size = ;
}
void push_back(Seqlist *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) { //Inc(list)用来判断增加顺序表容量是否成功,只有在失败的情况下才会进入if语句中
printf("顺序表容量已满,无法再在表尾继续插入新元素!\n");
return;
}
list->base[list->size] = x;
list->size++;
}
void push_front(Seqlist *list, ElemType x) {
if (list->size >= list->capacity && !Inc(list)) {
printf("顺序表容量已满,无法再在表头插入新元素!\n");
return;
}
for (int i = list->size;i > ;i--) {
list->base[i] = list->base[i - ];
}
list->base[] = x;
list->size++;
}
void show_list(Seqlist *list) {
for (int i = ;i < list->size;i++) {
printf("%d ", list->base[i]);
}
printf("\n");
}
void pop_back(Seqlist *list) {
if (list->size == ) {
printf("顺序表已空,无法再在表尾删除元素!\n");
return;
}
list->size--;
}
void pop_front(Seqlist *list) {
if (list->size == ) {
printf("顺序表已空,无法再在表头删除元素!\n");
return;
}
for (int i = ;i < list->size - ;i++) {
list->base[i] = list->base[i + ];
}
list->size--;
}
void insert_pos(Seqlist *list, int pos, ElemType x) {
if (pos< || pos>list->size) {
printf("插入位置不合法,无法插入元素!\n");
return;
}
if (list->size >= list->capacity && !Inc(list)) {
printf("顺序表容量已满,无法在插入新的元素!\n");
return;
}
for (int i = list->size;i > pos;i--) {
list->base[i] = list->base[i - ];
}
list->base[pos] = x;
list->size++;
}
int find(Seqlist *list, ElemType key) {
for (int i = ;i < list->size;i++) {
if (list->base[i] == key)
return i;
}
return -;
}
int length(Seqlist *list) {
return list->size;
}
void delete_pos(Seqlist *list, int pos) {
if (pos < || pos >= list->size) {
printf("删除位置不合法,无法删除元素!\n");
return;
}
for (int i = pos;i < list->size - ;i++) {
list->base[i] = list->base[i + ];
}
list->size--;
}
void delete_val(Seqlist *list, int key) {
int pos = find(list, key);
if (pos == -) {
printf("顺序表中没有这个元素!\n");
return;
}
delete_pos(list, pos);
}
void sort(Seqlist *list) {
for (int i = ;i < list->size - ;i++) {//排序的趟数(例如5个数据需要比较4趟)
for (int j = ;j < list->size - - i;j++) {//每一趟比较中的比较次数(例如5个数据在第0趟需要比较4次)
if (list->base[j] > list->base[j + ]) {
ElemType temp = list->base[j];
list->base[j] = list->base[j + ];
list->base[j + ] = temp;
}
}
}
}
void reverse(Seqlist *list) {
if (list->size == || list->size == ) return;
int low = , high = list->size - ;
while (low < high) {
ElemType temp = list->base[low];
list->base[low] = list->base[high];
list->base[high] = temp;
low++;
high--;
}
}
void clear(Seqlist *list) {
list->size = ;
}
void destroy(Seqlist *list) {
free(list->base);
list->base = NULL;
list->capacity = ;
list->size = ;
}
void merge(Seqlist *lt, Seqlist *la, Seqlist *lb) {
lt->capacity = la->size + lb->size;
lt->base = (ElemType*)malloc(sizeof(ElemType)*lt->capacity);
assert(lt->base != NULL);
int ia = , ib = , ic = ;
while (ia < la->size&&ib < lb->size) {
if (la->base[ia] < lb->base[ib]) {
lt->base[ic++] = la->base[ia++];
}
else {
lt->base[ic++] = lb->base[ib++];
}
}
while (ia < la->size) {
lt->base[ic++] = la->base[ia++];
}
while (ib < lb->size) {
lt->base[ic++] = lb->base[ib++];
}
lt->size = la->size + lb->size;
show_list(lt);
}
main.cpp
#include"seqlist.h"
void main() {
Seqlist list;
InitSeqlist(&list);
ElemType item;
int pos;
int select = ;
while (select) {
printf("*******************************************\n");
printf("*[1] push_back [2] push_front *\n");
printf("*[3] show_list [4] pop_back *\n");
printf("*[5] pop_front [6] insert_pos *\n");
printf("*[7] find [8] length *\n");
printf("*[9] delete_pos [10] delete_value *\n");
printf("*[11] sort [12] reverse *\n");
printf("*[13] clear [14] merge *\n");
printf("*[0] quit_system *\n");
printf("*******************************************\n");
printf("请选择:>>");
scanf("%d", &select);
if (select == ) break;
switch (select) {
case :
printf("请输入要插入的数据(-1结束):>");
while (scanf("%d", &item), item != -) {//先输入item的值,只要item不等于-1就接着循环
push_back(&list, item);
}
break;
case :
printf("请输入要插入的数据(-1结束):>");
while (scanf("%d", &item), item != -) {
push_front(&list, item);
}
break;
case :
show_list(&list);
break;
case :
pop_back(&list);
break;
case :
pop_front(&list);
break;
case :
printf("请输入要插入的数据:>");
scanf("%d", &item);
printf("请输入要插入的位置:>");
scanf("%d", &pos);
insert_pos(&list, pos, item);
break;
case :
printf("请输入要查找的数据:>");
scanf("%d", &item);
pos = find(&list, item);
if (pos == -)
printf("查找的数据元素不在顺序表中!\n");
else
printf("查找的数据元素在顺序表中的下标位置为%d\n", pos);
break;
case :
printf("顺序表的长度为%d\n", length(&list));
break;
case :
printf("请输入要删除数据在顺序表中的下标位置:>");
scanf("%d", &pos);
delete_pos(&list, pos);
break;
case :
printf("请输入要删除数据的值:>");
scanf("%d", &item);
delete_val(&list, item);
break;
case :
sort(&list);
break;
case :
reverse(&list);
break;
case :
clear(&list);
break;
case :
Seqlist mylist, yourlist;
ElemType item1, item2;
InitSeqlist(&mylist);
InitSeqlist(&yourlist);
printf("请输入顺序表1中的元素值(-1结束):>");
while (scanf("%d", &item1), item1 != -) {
push_back(&mylist, item1);
}
printf("请输入顺序表2中的元素值(-1结束):>");
while (scanf("%d", &item2), item2 != -) {
push_back(&yourlist, item2);
}
merge(&list, &mylist, &yourlist);
destroy(&mylist);
destroy(&yourlist);
break;
default:
printf("输入的选择错误!请重新输入!\n");
break;
}
}
destroy(&list);
}
C语言版本:顺序表的实现的更多相关文章
- C语言实现顺序表
C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...
- C++语言实现顺序表
C++语言实现顺序表 顺序表的定义及其特点 顺序表的定义是:把线性表中的所有表项按照其逻辑顺序依次存储到从计算机存储中指定存储位置开始的一块连续的存储空间中. 这样,线性表中第一个表项的存储位置就是被 ...
- C语言实现顺序表(顺序存储结构)
顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...
- java语言建立顺序表
package datastructure; //线性表 public interface IList { public void clear(); public boolean isEmpty(); ...
- C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...
- c语言实现--顺序表操作
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...
- 顺序表及其多种实现方式 --- C/C++
所谓顺序表,即线性表的顺序存储结构.下面给出的是数据结构---线性表的定义. ADT List{ 数据对象: 线性表的数据对象的集合为{a1,a2,a3,...,an},每个元素的类型为ElemTyp ...
- C++实现动态顺序表
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存 ...
- 动态顺序表(C++实现)
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...
随机推荐
- Tushare test
查看版本 import tushare print(tushare.__version__) 1.2.12 初步的调用方法为: import tushare as ts ts.get_hist_dat ...
- switchable图片切换
前提: 最近由于项目的需要jquery "switchable图片切换"效果 所以趁着周末有空时间研究下 ,以前工作都依赖于kissy框架,所以也没有综合的写过类似的,如下图所示效 ...
- Elasticsearch学习笔记1
Json (JavaScript Object Notation),即JavaScript对象标记法,当前十分流行和常见的互联网数据传输格式,尤其是在前端领域.Json是一种用于数据交换的文本格式,目 ...
- mybatis的一对一,一对多查询,延迟加载,缓存介绍
一对一查询 需求 查询订单信息关联查询用户信息 sql语句 /*通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接*/ SELECT orders.*, ...
- SystemView SEGGER FreeRTOS 移植和使用
/* 官方帮助英文翻译文档参考:https://blog.csdn.net/bjr2016/article/category/7275877. */ /* 移植文档参考:https://blog.cs ...
- mysql中唯一约束用法
以前比较naive,有次同事一定要在表里建唯一约束的时候,我就很纳闷为啥非要在db层面做限制,在自己的业务代码里做啊,就是说入库的时候先查一遍有没有,没有记录的情况再准许入库. 后来发现如果只是自己处 ...
- Linux下端口被占用确认
有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln netstat -tln | g ...
- Python3入门(四)——Python函数
一.概述 python和其他高级语言一样,支持函数 注意和scala不一样,结果必须使用return,否则默认return None!这和scala最后一个值作为返回是不一样的! 二.函数调用 和其他 ...
- 20155233 《网络对抗》Exp2 后门原理与实践
实验过程 1.Win获得Linux Shell windows:使用ipconfig指令查看本机ip: windows:使用ncat命令打开监听: Linux反弹连接win: 输入 nc window ...
- 20155307《网络对抗》MSF基础应用
实验过程 实验系统 所需设备: 靶机1:Windows XP Professional SP2 ,IP地址:192.168.1.128 靶机2:Windows XP Professional SP3 ...