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++实现)
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...
随机推荐
- saxbuilder用法
xml为我们在网络交换数据带来很大方便,在java中可以使用saxbuilder来操作xml格式文件,下面介绍一下saxbuilder的常用方法. import org.jdom.Document; ...
- Markdown基本语法规范
1. 标题 #的个数即表示Hn, 一下依次从h1~h6. 也可在句尾添加同样个数的#(也可忽略) # This is H1 ## This is H2 ### This is H3 #### Thi ...
- [AHOI2014/JSOI2014]支线剧情
题目 有源汇上下界最小费用可行流 首先注意到要求是每一条边都经过至少一次,所以对于每一条边我们设成\([1,\infty]\)就好了 另外所有点都能结束剧情,所有点都要向汇点\(t\)连一条\([0, ...
- Postman-自动化传参
一,自动化传参 在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要 ...
- PAT B1006 换个格式输出整数 (15 分)
让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 BBSSS123 ...
- Python开发简单爬虫
简单爬虫框架: 爬虫调度器 -> URL管理器 -> 网页下载器(urllib2) -> 网页解析器(BeautifulSoup) -> 价值数据 Demo1: # codin ...
- 20155336虎光元 Exp1PC平台逆向破解及Bof基础实践
20155336Exp1 PC平台逆向破解(5)M 实践目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入 ...
- 在java代码中执行js脚本,实现计算出字符串“(1+2)*(1+3)”的结果
今天在公司项目中,发现一个计算运费的妙招.由于运费规则各种各样,因此写一个公式存到数据库.下次需要计算运费时,直接取出这个公式,把公式的未知变量给替换掉,然后计算出结果就是ok了. 一 ...
- POJ 3041&&3020
两道二分图的练手题. 3041:题意大概是在一个N*N的图上有K个东西,你每次可以清除一行或一列上的所有东西.让你求最少的操作次数. 我们根据题意建图.对于每一个点的坐标(x,y)之间连一条边.比如样 ...
- EZ 2017 01 07 t
这名字诡异(然而就是这样) 这次主要是yekehe和yu‘ao都来了,所以很开心的讨论(上了200). 但是,yu’ao dalao又AK了!(666666) 不过总体难度也不高,主要是T3没思路. ...