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语言版本:顺序表的实现的更多相关文章

  1. C语言实现顺序表

    C语言实现顺序表代码 文件SeqList.cpp #pragma warning(disable: 4715) #include"SeqList.h" void ShowSeqLi ...

  2. C++语言实现顺序表

    C++语言实现顺序表 顺序表的定义及其特点 顺序表的定义是:把线性表中的所有表项按照其逻辑顺序依次存储到从计算机存储中指定存储位置开始的一块连续的存储空间中. 这样,线性表中第一个表项的存储位置就是被 ...

  3. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  4. java语言建立顺序表

    package datastructure; //线性表 public interface IList { public void clear(); public boolean isEmpty(); ...

  5. C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...

  6. c语言实现--顺序表操作

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...

  7. 顺序表及其多种实现方式 --- C/C++

    所谓顺序表,即线性表的顺序存储结构.下面给出的是数据结构---线性表的定义. ADT List{ 数据对象: 线性表的数据对象的集合为{a1,a2,a3,...,an},每个元素的类型为ElemTyp ...

  8. C++实现动态顺序表

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存 ...

  9. 动态顺序表(C++实现)

    顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ...

随机推荐

  1. 【转】org.jdom.IllegalDataException: The data ""is not legal for a JDOM attribute: 0xb is not a legal 异常

    今天用jdom生成xml,在操作中出现了 org.jdom.IllegalDataException: The data ""is not legal for a JDOM att ...

  2. Python csv.md

    csv csv模块可以用于处理从电子表格和数据库导出的数据到带有字段和记录格式的文本文件,通常称为逗号分隔值(csv)格式,因为逗号通常用于分隔记录中的字段. Reading csv.reader(c ...

  3. 2.2.1 LinearLayout(线性布局)

    本节引言 本节开始讲Android中的布局,Android中有六大布局,分别是: LinearLayout(线性布局), RelativeLayout(相对布局), TableLayout(表格布局) ...

  4. vue计算属性和vue实力的属性和方法

    生命周期 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  5. 如何使用seajs+jQuery构建中型项目

    为何有这种想法? 由于最近做的项目是用jquery+seajs集成的,所以就突发奇想 如何使用seajs+jquery能更好的构建项目,比如能解决模块化,模块与模块之间的依赖,文件上线后打包,压缩等能 ...

  6. window.location对象详解

    window.location.href(当前URL) 结果如下: http://www.myurl.com:8866/test?id=123&username=xxx window.loca ...

  7. golang交叉编译:Linux - Windows

    环境:Debian jessiego 1.7.4Windows 7 背景: 在debian中写好的程序编译后在windows上运行. 程序中使用了sqlite3 import( _ "git ...

  8. AbelSu教你搭建go语言开发环境

    go语言官网:https://golang.org/ windows:官网下载go1.6.windows-amd64.msi安装文件,安装位置选择默认C:\Go\安装结束后配置环境变量Path: C: ...

  9. MSF里MS17_010利用模块笔记

    1.   auxiliary/scanner/smb/smb_ms17_010      //扫描检测漏洞辅助模块 扫描结果这里可以看到 2,3,4这几台主机存在此漏洞! 2.     auxilia ...

  10. 20155217《网络对抗》Exp05 MSF基础应用

    20155217<网络对抗>Exp05 MSF基础应用 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 一个主动攻击实践,如ms ...