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++实现)
		顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构. 这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的 ... 
随机推荐
- JAVA 第一周学习总结
			20175308 2018-2019-2 <Java程序设计>第一周学习总结 教材学习内容总结 1.关于java 2.java开发环境的配置 3.java编译.运行的简单实例 4.git的 ... 
- scrapy (四)基本配置
			scrapy使用细节配置 一.建立项目 1.scrapy startproject 项目名字 2.进入项目: scrapy genspider 名字 不带http的根网址 3.默认模板(或改变模板) ... 
- ansible 远程以普通用户执行命令
			1. ansible 10.0.0.1 -m raw -a "date" -u www 2.在ansible的主机配置文件中指定ssh_uservi/etc/ansible/hos ... 
- SNAT和DNAT
			1.SNAT iptables防火墙 Centos6.6 64位 iptables 内网:eth0 172.16.4.1 外网:eth 112.112.112.112/24 当有用户访问公网时,修改用 ... 
- BroadcastReceiver广播相关 - 转
			BroadcastReceiver广播接收者用于接收系统或其他程序(包括自己程序)发送的广播. 一.注册广播 在android中,我们如果想接收到广播信息,必须自定义我们的广播接收者.要写一个类来继承 ... 
- Exp02
			使用netcat后门工具 原理示意图 使用netcat获取主机操作Shell,cron启动 Win获取Linux Shell Linux获取Win Shell cron启动 用man -k指令查看有关 ... 
- TPM及TSS协议栈的安装使用
			TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ... 
- 【php增删改查实例】第七节 - 部门管理模块(画一个datagrid表格)
			在easyui中,datagrid组件需要用一个table标签去渲染. <table id="grid0" title="部门管理" class=&quo ... 
- [hdu5503]EarthCup[霍尔定理]
			题意 一共 \(n\) 只球队,两两之间会进行一场比赛,赢得一分输不得分,给出每只球队最后的得分,问能否构造每场比赛的输赢情况使得得分成立.多组数据 \(T\le 10,n\le 5\times 10 ... 
- R绘图 第四篇:绘制箱图(ggplot2)
			箱线图通过绘制观测数据的五数总括,即最小值.下四分位数.中位数.上四分位数以及最大值,描述了变量值的分布情况.箱线图能够显示出离群点(outlier),离群点也叫做异常值,通过箱线图能够很容易识别出数 ... 
