#include<iostream.h> 头文件;

#include<iostream.h>
#define MAX 1024
typedef int Elemtype;
typedef struct
{
int *elem;
int length;
}Sqlist; void Initlist(Sqlist &L)
{
L.elem=new int[MAX];
if(L.elem==NULL)
return;
else
L.length=;
} void createlist(Sqlist &L)
{
cin>>L.length;
for(int i=;i<L.length;i++)
cin>>L.elem[i];
} void printlist(Sqlist L)
{
for(int i=;i<L.length;i++)
cout<<L.elem[i]<<'\t';
} int emptylist(Sqlist L)
{
if(L.length==)
return ;
else
return ;
} int queryelem(Sqlist L,Elemtype e)
{
for(int i=;i<L.length;i++)
if(L.elem[i]==e)
return i+;
return ;
} void getelem(Sqlist L,int i,int &e)
{
if(i< || i>L.length)
return;
else
e=L.elem[i-];
} void insertelem(Sqlist &L,int i,int e)
{
if(i< || i>L.length+)
return;
else
for(int k=L.length-;k>i-;k--)
L.elem[k+]=L.elem[k];
L.elem[i-]=e;
L.length ++;
} void main()
{
Sqlist L;
Initlist(L);
createlist(L);
printlist(L);
int null;
null=emptylist(L);
if(null==)
cout<<"it is nulllist";
else
cout<<" \nit is not nulllist";
int e;
cout<<"\nput on query elem";
cin>>e;
int i;
i=queryelem(L,e);
if(i!=)
cout<<i;
cout<<"\n put on di ji ge elem";
cin>>i;
getelem(L,i,e);
cout<<e;
cout<<"put on insert elem and locate";
cin>>i>>e;
insertelem(L,i,e);
printlist(L);
}

#define MAX 1024 宏定义
typedef int Elemtype; typedef                                     (取一个别名), int的别名就是Elemtype。
typedef struct                   定义一个结构体,这个结构体的名字叫做SqList;这个SqList的结构体中有整型的*elem,整型的length
{
Elemtype *elem;
int length;
}SqList;
void InitList(SqList &L)                初始化函数来初始我定义的SqList &L这个结构体的变量,注意加&是改变L这个结构体变量的数据。
{
L.elem=new Elemtype[MAX];              通过new函数 申请一个整型的数组,将这个数组赋予给L.elem这个指针,L.elem是调用这个elem这个整型指针。
if(L.elem==NULL)                  如果这个空间为空的话,则不带返回值的return语句只能用于返回类型为void的函数,return语句是为了引起函数的强制结束,
                      这种用法类似于循环结构中的break语句的作用。new函数申请整型数组赋予结构体当中的指针。为什么要赋予给指针,因为

                      在c++中,数组其实指针来解释的。    
return ;                   判断开辟空间成功还是失败,失败是NULL,直接退出。成功为0
else
L.length=0;                 否则就是有空间,但是这个空间还没有数据,所以他的长度为0. 有空间就相当于开辟了一个长方形。
}

void creat_list(SqList &L)            创建一个有数据的线性表的函数。
{
cin>>L.length;               输入这个线性表的长度,例如你输入5,代表在这个长方形中划4条竖线,不就有5个格子呢。5个格子还没有数据对不对啊?
for(int i=0;i<L.length;i++)           所以我们就需要用for循环来为这5个格子填写你想要的数据,不就行了。for循环输入每个具体的数据
cin>>L.elem[i];                电脑出现让你输5次。你就输呗。
}
void print(SqList L)              创建一个打印函数。结构体Sqlist定义的L为什么没有像以前那样加&号,是因为打印函数根本没有改变L的数据啊
{
for(int i=0;i<L.length;i++)            打印不就循环小于你输入这个线性表的长度。  直接用for循环遍历即可打印。
cout<<L.elem[i]<<'\t';             输出你打印的就行了。  打印好看点,打印的就不会挤在一起呢。\t相当于tab制表符的缩写,跳过四个空格;
}
int IsEmpty(SqList L)              判断这个线性表是否为空的话,
{
if(L.length==0)                 如果是1的话就为真。   其实就是判断线性表的长度是否为0;
return 1;
else
return 0;                    否则就为假呗。
}
void Getelem(SqList L,int i,Elemtype &e)       获取L中的第i个元素。第i个元素是就信息世界而言的,是对人类好理解的,对程序而言的话。第i个元素的是
                          第i-1个元素。知道获取的范围;
{
if(i<1||i>L.length)                  刁难一下,获取的不在这个线性表的长度范围之内。
return;
else
e=L.elem[i-1];                 如果在的话,就把这个第i个元素的值赋给e呗。 线性表中的第几个元素对应的值都是固定的,因此根本就不必要想遍历。
}
int Locatelem(SqList L,Elemtype e)          这个函数就是判断这个线性表中的数据e是在第几个位置。Locatelem就是干这活的。
{
for(int i=0;i<L.length;i++)//n              首先遍历我这个线性表L中的所有数据,遍历最好用的当然是for循环呢。遍历这个线性表只要小于这个线性表的
                         长度即可         查询一个元素的位置当然第一步就是遍历所有的元素,看是否有符合条件的,
if(L.elem[i]==e) //n T(n)=O(n) T(n)=O(1)         遍历一个,判断一个,看他是否是在第e个位置。
return i+1;                      是的话,放回一个i+1,为什么是i+1呢,因为对程序而言,他想的第一个是第从0开始,而我们人类想的第一个
                          是从第1开始的,所以这个变成了i+1,而不是i呢。
return 0;                       如果全部遍历完了之后,都没有找到数据e,就返回0呢呗。
}
void InsertList(SqList &L,int i,Elemtype e)        这个一个插入函数,就是在第i个插入e这个元素。
{
if(i<1||i>L.length+1)                刁难一下,就是如果i<1的话和i>这个长度加1的话,为什么这个长度要加1呢,因为大于线性表的长度是可以,如
                        线性表的长度是5,大于5,也就是第6个,在第6个插入元素e,是完全ok的啦。  判断插入的是否在这个范围?
cout<<"位置不合理\n";
else
if(L.length>=MAX)               相当于把这张纸开辟出的长方形已经占满呢,无法再开辟呢,说明就无法再插入呢,所以表就已满呢
cout<<"表已满\n";
else
{
for(int j=L.length-1;j>=i-1;j--)             首先我肯定是遍历后三个手指,也就是第i之后的元素。     插入肯定要遍历呢。遍历后向后挪一位。空的位置赋予新值
L.elem[j+1]=L.elem[j];                 然后把三个手指往后挪一位就可以。就在第i处空出一个位置呢。 表自增。
L.elem[i-1]=e;                   然后把空出的位置给e即可
L.length++;                   在把整个线性表的长度加1即可。
}
}
void main()                   主函数的定义
{
SqList L;                      结构体sqlist定义一个名为L的线性表。
InitList(L);                      通过初始化函数初始这个线性表。就是给这个线性表开辟一个空间,相当于给一张纸开辟出一个长方形。
creat_list(L);                    创建一个有数据的线性表,相当于给这张纸画4条竖线。
print(L);                        打印这个线性表
int len;
len=IsEmpty(L);
if(len==1)
cout<<"空表";
else
{
cout<<"非空";
}
int i;
cout<<"\n请输入查找的位置:";
cin>>i;
Elemtype e;
Getelem(L,i,e);                     获取线性表中第i个元素,并将第i个元素的值赋予e
cout<<e<<endl;
cout<<"\n请输入查找的元素的值:";
cin>>e;
i=Locatelem(L,e);                      查找线性表中e这个元素是在线性表中排第几个。
if(i!=0)
cout<<i<<endl;
cout<<"\n请输入插入的位置和元素的值:";
cin>>i>>e;
InsertList(L,i, e);                        在线性表L中的第i处插入名为e的元素。
print(L);

}

数据结构默写代码:

 #include<iostream.h>
#define MAX 1024
typedef int Elemtype;
typedef struct
{
Elemtype *elem;
int length;
}Sqlist; void Initlist(Sqlist &L)
{
L.elem=new Elemtype[MAX];
if(L.elem==NULL)
return;
else
L.length=;
} void createlist(Sqlist &L)
{
cin>>L.length;
for(int i=;i<L.length;i++)
cin>>L.elem[i];
} void printlist(Sqlist L)
{
for(int i=;i<L.length;i++)
cout<<L.elem[i]<<'\t';
} int emptylist(Sqlist L)
{
if(L.length==)
return ;
else
return ;
} void getelem(Sqlist L,int i,int &e)
{
if(i<||i>L.length)
return;
else
e=L.elem[i-];
} void insertelem(Sqlist &L,int i,int e)
{
if(i< || i>L.length+)
return;
else
for(int k=L.length-;k>=i-;k--) 为什么k=L.length-1呢,因为他想第5个手指,对程序而言,其实就是4,0是第一个。把4往后挪一位,变成5。
L.elem[k+]=L.elem[k];         
L.elem[i-]=e;
L.length ++;
} int locateelem(Sqlist L,int e)
{
for(int i=;i<L.length;i++)
if(L.elem[i]==e)
return i+;
return ;
}
void main()
{
Sqlist L;
Initlist(L);
createlist(L);
printlist(L);
int null;
null=emptylist(L);
if(null==)
cout<<"it is nulllist";
else
cout<<"it is not nulllist"<<"\n";
int i;
cout<<"put on locate"<<'\t';
cin>>i;
int e;
getelem(L,i,e);
cout<<e;
cout<<"\nput on your insert elem locate and elem value";
cin>>i>>e;
insertelem(L,i,e);
printlist(L);
cout<<"\nput on your query elem";
cin>>e;
i=locateelem(L,e);
if(i!=)
cout<<i<<endl; }

void deleteelem(Sqlist &L,int i)
{
if(i<1 || i>L.length+1)
return;
else
for(int k=i;k<=L.length-1;k++)
L.elem[k-1]=L.elem[k];
L.length --;
}

数据结构之c++感悟的更多相关文章

  1. Github Action 快速上手指南

    前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...

  2. 20145205 java语言实现数据结构实验一

    数据结构实验要求 综合类实验设计3 已知有一组数据a1a2a3a4--anb1b2b3b4--bm,其中ai均大于bj,但是a1到an和b1到bm不是有序的,试设计两到三个算法完成数据排序,且把bj数 ...

  3. Python数据结构与算法设计总结篇

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...

  4. 2015年,从毕业到工作的几点感悟(Android开发新人)

    锄禾日当午,汗滴禾下土.       2015年,从毕业到工作的几点感悟(Android开发): 多用三方类库:(成长经验:尽量不要自己手动实现网络上已经有的优秀开源类库的功能,例如: 网络请求:常见 ...

  5. 从c开始,小小感悟

    c语言是众多编程小白进入编程大门的钥匙,不过许多人在学习一段时间以后就渐渐产生了困惑,枯燥的黑色界面渐渐让他们失去了"渴望",---我还不能制作出一款像样的软件,我还是只是在算数学 ...

  6. Redis各种数据结构性能数据对比和性能优化实践

    很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...

  7. 深入理解Java虚拟机---学习感悟以及笔记

    一.为什么要学习Java虚拟机?       这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器.曾经的我经常害怕处理内存溢 ...

  8. 2018/2/14 设计模式学习笔记(一) 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟

    因为本人目前为止学习编程不过七个月,所以后面的感悟对于一些大神来说可能嗤之以鼻,但对于一些刚刚入门的萌新来说在理解面向对象的思想上,以及抽象类和接口应该怎么设计等方面应该还是会有所帮助的 首先我们定义 ...

  9. 20162327WJH程序设计与数据结构第七周总结

    学号 20162327 <程序设计与数据结构>第7周学习总结 教材学习内容总结 1.关于接口的理解:接口可以理解为比较纯粹的抽象类 2.接口的特点:用interface定义接口 接口中的方 ...

随机推荐

  1. django Q条件

    #q条件from django.db.models import Qq = Q(name__startswith="p") | Q(name__startswith="l ...

  2. mybatis-mybatis-config.xml详细介绍

    1.mybatis-config.xml 1.1:配置,配置可以是引入外部文件,也可以是在本文件内写配置 <!-- <properties resource="jdbc.prop ...

  3. java Vamei快速教程17 多线程

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方 ...

  4. java Vamei快速教程11 对象引用

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式.这方面的 ...

  5. POJ 3469 Dual Core CPU(最小割模型的建立)

    分析: 这类问题的一遍描述,把一些对象分成两组,划分有一些代价,问最小代价.一般性的思路是, 把这两组看成是S点和T点,把划分的代价和割边的容量对应起来求最小割. 把S和可模版tem之间到达关系看作是 ...

  6. python_66_生成器2

    import time def consumer(name): print('%s准备吃包子 '%name) while True: baozi=yield print('包子[%s]来了,被[%s] ...

  7. SyntaxError: Non-ASCII character ‘\xe5′ in file和在代码中插入中文,python中文注释

    SyntaxError: Non-ASCII character '\xe7' in file 出现这种错误的原因是程序中的编码出问题了,只要在程序的最前面加上 #coding: utf-8 重新保存 ...

  8. 使用git stash命令保存和恢复进度

    使用git stash命令保存和恢复进度 git stash 保存当前工作进度,会把暂存区和工作区的改动保存起来.执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有 ...

  9. Java 解决IE浏览器下载文件,文件名出现乱码问题

    /** * 区分ie 和其他浏览器的下载文件乱码问题 * @param request * @param fileName * @return */ public String getFileName ...

  10. Http请求 GET和POST,405错误

    我就简单说吧,在用SringMVC时,我们通常会用到 @RequestMapping(value="/test",method=RequestMethod.GET) public ...