/*
* 若各个方法结构体变量参数为: &L(即地址符加变量)则结构体变量访问结构成员变量时使用"."
* 若为:*L(即取地址符加变量)则结构体变量访问结构体成员变量使用"->"
* malloc()和free()是C++/C语言的标准库函数,
* new()和delete()是C++的运算符它们都可用于申请动态内存和释放内存
* 动态分配内存
*/
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define LIST_INIT_SIZE 5 typedef struct { //结构体
ElemType *elem;
int length;
int listsize;
}SqList;
//1.初始化
int InitList_Sq(SqList &L){
//构造一个空的线性表
L.elem=new ElemType[LIST_INIT_SIZE];//申请动态空间
//L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if (L.elem==0) //申请动态空间未成功
{
printf("failure!\n");
return 0;
}
else
{ //空间申请成功
L.length=0; //初始化表的实际长度为0
L.listsize=LIST_INIT_SIZE; //初始化表的最大长度100
return 1;
}
}
//2.插入表尾
int ListEndInsert_Sq(SqList &L,ElemType e){
int *newbase; //在表尾插入数据
if(L.length==L.listsize) //实际长度等于最大长度 ,空间不足,再做插入
{
newbase = (int *)realloc(L.elem,(L.listsize+LIST_INIT_SIZE)*sizeof(int)); //动态分配内存
L.elem = newbase; //内存分配成功之后再次指向
L.listsize+=LIST_INIT_SIZE;
}
if(!newbase){
printf("overflow!\n"); //输出溢出
return -1;
}
L.elem[L.length]=e; //若空间足够,在表尾插入数据
L.length++; //实际长度加一
return 1;
}
//3.插入i位置
int ListInsert_Sq(SqList &L,int i,ElemType e){
//在动态顺序表L的第i个位置插入元素e
ElemType *p,*q; //定义两个指针变量,一个用于指向要插入的数据,一个指向要插入的位置的数据
int *newbase; //用于扩展内存
if (i<=0 || i>L.length+1) //若插入位置不合法
{
printf("error!\n"); //输出错误
return 0;
}
if(L.length==L.listsize) //实际长度等于最大长度 ,空间不足,再做插入
{
newbase = (int *)realloc(L.elem,(L.listsize+LIST_INIT_SIZE)*sizeof(int)); //动态分配内存
L.elem = newbase; //内存分配成功之后再次指向基地址
L.listsize+=LIST_INIT_SIZE;
}
if(!newbase){
printf("overflow!\n"); //输出溢出
return -1;
}
q=&(L.elem[i-1]); //q指针指向要插入的位置
for(p=&(L.elem[L.length-1]);p>=q;--p)//循环从表尾开始,直到q指针所指的位置
{
*(p+1)=*p; //利用指针元素依次后移
}
*q=e; //把移出的位置插入输入的数据
L.length++; //长度加一
return 1;
}
//4.输出
void Print_Sq(SqList &L){ //输出动态线性表元素
ElemType *p;
for(p = &(L.elem[0]); p <= &(L.elem[L.length-1]); p++)//利用指针从表头开始循环,到表尾结束
{
printf("%d ",*p); //输出每个元素的值
}
printf("\n");
}
//5.删除表头
int DelHeadList_Sq(SqList &L){ //删除表头数据元素
ElemType *p; //定义一个指针变量,用于移动元素
if(L.length == 0){ //若为空表则输出UNDERFLOW!
printf("UNDERFLOW!");
return -1;
}
else
{
for(p = &(L.elem[1]); p <= &(L.elem[L.length-1]); p++){ //从第二个元素开始,依次向前移一位。
*(p-1) = *p; //后一个元素赋到前一个元素上
}
L.length--; //长度减一
return 1;
}
}
//6.删除表尾
int DelEndList_Sq(SqList &L){
if(L.length == 0){ //若为空表
printf("UNDERFLOW!"); //输出溢出
return -1;
}
else{
L.length--; //表长度减一
return 1;
}
}
//7.删除第i个元素
int DelList_Sq(SqList &L,int i){
ElemType *p; //定义一个指针,用于循环移动表元素
if(i <= 0 || i > L.length){ //若i的位置小于0或大于表长度,输出Error
printf("Error!");
return 0;
}
if(L.length == 0){ //若长度为0输出溢出
printf("UNDERFLOW!");
return -1;
}else{
for(p = &(L.elem[i]); p <= &(L.elem[L.length-1]); p++){//循环从指定删除数据的位置开始,依次前移
*(p-1) = *p; //后一个元素覆盖前一个元素
}
L.length--; //长度减一
return 1;
}
}
//8.查询
int FindList_Sq(SqList &L, ElemType e){
ElemType *p;
int i=0;
for(p = &(L.elem[0]); p <= &(L.elem[L.length-1]); p++){
if(*p == e){ //在顺序表L中查找元素e是否存在,
return (i+1); //如果存在返回对应的下标i+1
}
i++;
}
return 0; //否则返回0
}
//主函数
int main(void){
SqList SSL; //结构体变量,若SSL为指针则访问结构体成员变量需要使用SSL->elem、SSL->length或者(*SSL).elem、(*SSL).length
int i,x,m;
InitList_Sq(SSL); //初始化线性表
printf("Enter Numbers:\n");
while(1) //直到你输入9999时才结束输入
{
scanf("%d",&x);
if(x==9999)
break;
else
{
ListEndInsert_Sq(SSL,x);//插入数据
}
}
printf("The array elems:\n");
Print_Sq(SSL); //输出表元素
printf("(1).请输入要插入数据的位置i:\n");
scanf("%d",&i); //输入你要插入的位置
printf("请输入要插入的数据x:");
scanf("%d",&x); //输入你要插入的数据
ListInsert_Sq(SSL,i,x);
printf("The new array elems:\n");
Print_Sq(SSL); //再次输出插入数据后的表
printf("删除表头后:\n");
DelHeadList_Sq(SSL); //删除表头元素
Print_Sq(SSL); //再次输出删除的后的表
printf("删除表尾后:\n");
DelEndList_Sq(SSL); //删除表尾元素
Print_Sq(SSL); //再次打印删除删除后的表
printf("(2).请输入要删除数据的位置i:");
scanf("%d",&i);
DelList_Sq(SSL,i); //删除指定位置的元素
printf("删除指定位置数据后:\n");
Print_Sq(SSL); //再次打印删除删除后的表
printf("(3).请输入要查询的数据X:"); //指定要查询的 数据
scanf("%d",&x);
m = FindList_Sq(SSL,x); // 调用查询方法
if(m!=0){
printf("found:位置:%d 数据:%d\n",m,x);
}else{
printf("no-found:数据:%d\n",x);
}
return 0;
}

数据结构C语言版--动态顺序表的基本功能实现(二)的更多相关文章

  1. 数据结构C语言版--静态顺序表的基本功能实现(一)

    /* * 功能:创建一个线性表,并输出 * 静态分配内存 */ #include<stdio.h> //stdio.h是C的标准I/O库 //#include<iostream> ...

  2. 数据结构C语言版干货------->线性表之顺序表

    一:头文件定义 /*************************************************************************** *项目 数据结构 *概要 逻辑 ...

  3. 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...

  4. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  5. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  6. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  7. C语言实现的顺序表

    顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...

  8. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  9. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

随机推荐

  1. 执行update语句mysql5.6报错ERROR 1292 (22007): Truncated incorrect DOUBLE value: '糖糖的坤大叔'

    执行修改语句update tbl_user_details set nickname=CONCAT("用户",yunva_id) where nickname = yunva_id ...

  2. nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步

    nagios监控mysql主从同步 起因:nagios可能监控到mysql服务的运行情况,但确不能监控mysql的主从复制是否正常:有时候,同步已经停止,但管理人员却不知道. 登陆mysql从服务器, ...

  3. Go语言规格说明书 之 通道类型(Channel types)

    go version go1.11 windows/amd64 本文为阅读Go语言中文官网的规则说明书(https://golang.google.cn/ref/spec)而做的笔记,介绍Go语言的 ...

  4. OCM_第十九天课程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 应用/DATA GUARD 搭建

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  5. MySQL索引失效的几种情况

    1.索引不存储null值 更准确的说,单列索引不存储null值,复合索引不存储全为null的值.索引不能存储Null,所以对这列采用is null条件时,因为索引上根本 没Null值,不能利用到索引, ...

  6. day10--进程

        进程: Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时运行一个线程,因此 Python 多线程程序并不能改善程序性能,不能发挥多核系统的优势,可以通过 ...

  7. Jenkins Pipline语法

    引用自:http://baijiahao.baidu.com/s?id=1582812185263227836&wfr=spider&for=pc 引用自:https://www.cn ...

  8. div+css中height:auto !important; height:663px; min-height:663px !important;区别

    height:auto !important是高度自适应,主要的是,!important只是对于ie6不认识而已,其他浏览器都是以这个为最高的优先级,执行这个,ie6会无视这个,不是只有火狐而已hei ...

  9. See you~ HDU1892

    一开始还离散化弄了好久  离散化细节弄得好差 这题用二维树状数组做很快  因为树状数组下标不为0  所以所有下标要加一处理 还有就是算矩阵的时候要处理两个坐标的大小关系 个人感觉树状数组用for语句写 ...

  10. 7-4素数环 uva 524

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using ...