《数据结构》C++代码 线性表
线性表,分数组和链表两种(官方名称记得是叫顺序存储和链式存储)。代码里天天用,简单写写。
首先是数组,分静态、动态两种,没什么可说的,注意动态的要手动释放内存就好了。
其次是链表,依旧分静态、动态。课内一般都是讲的是动态实现,但其实还有一种静态实现方法。动态实现剩内存,但是静态实现剩时间,考试的时候当然是要视情况而定的。但是我估计,课内考试应该不会去卡这个时间,所以大家应该是不用担心(仅仅是个人看法,真被数据卡了别找我……)。
特别说明,静态链表实现,应当在开始申请够足够的内存,大家尽量在没有内存大量复用的时候使用。举个例子,比如链表里同时最多存在10000个数,但却随着过程中不断的添删,总共会有1000000000个数,那么显然应当重复使用10000个内存才对。于是,我们静态实现的话,便要自己管理内存,这简直是太麻烦了……而且会大大增加程序运行时间,还不如直接使用动态实现呢。
没啥可说的,代码很短,看了自然就懂了。没啥题目,就是简单写两句,直接上代码:
代码中给出如下定义:
1 const int maxn = 100; 2 int N; cin>>N; // 以N个数的线性表为例
数组实现:
1 int A[maxn+1]; // 数组 静态实现 2 3 int *A=new int[maxn+1]; // 数组 动态实现 4 delete[] A; 5 6 A[i]=3; // 使用方法相同
链表结点定义:
1 struct node // 链表结点定义 以双向链表为例 2 { 3 int c; 4 node *l,*r; 5 node(int _c=0) { c=_c; l=r=0; } 6 node* born(node *u) // 在this右侧插入点u 7 { 8 node *v=r; // 由于在this右侧插入,故this!=B,v!=0 9 u->r=v; if(v) v->l=u; // 但开始的时候,A born B时会产生v==0的状态 10 u->l=this; r=u; 11 return u; 12 } 13 void del() // 删除this右侧点 14 { 15 node *u=r,*v=r->r; // 由于u右侧应有点,故u->r!=B,即v!=B 16 r=v; if(v) v->l=this; // 这里可以不用if(v),因为就算删最后一个点,v也是B,不会不存在 17 delete u; // 静态实现的时候,无需删除,也无法删除,此句省去即可 18 } 19 };
动态链表:
1 class List // 链表 动态实现 2 { 3 node *A,*B; 4 public: 5 node* add(int c=0) { return A->born(new node(c)); } 6 void del(int c) 7 { 8 for(node *p=A;p->r!=B;p=p->r) 9 if(p->r->c==c) { p->del(); break; } 10 } 11 void look() { for(node *p=A->r;p!=B;p=p->r) cout<<p->c<<" "; } 12 void clear() { while(A->r!=B) A->del(); } 13 14 List(int N=0) 15 { 16 A=new node; B=add(); // 设置2个空结点,一头一尾,比较对称,不过多一个点,看个人习惯。这时,A->r==B是链表空的判断标准。 17 for(int x,i=1;i<=N;++i) { cin>>x; add(x); } 18 } 19 ~List() { clear(); } 20 };
静态链表:
1 class List // 链表 静态实现 2 { 3 int L; 4 node Box[maxn],*A,*B; 5 node* make(int c=0) { Box[L].c=c; return &Box[L++]; } // 使用时,仅仅是将new node换成make就好了 6 public: 7 node* add(int c=0) { return A->born(make(c)); } 8 void del(int c) 9 { 10 for(node *p=A;p->r!=B;p=p->r) 11 if(p->r->c==c) { p->del(); break; } 12 } 13 void look() { for(node *p=A->r;p!=B;p=p->r) cout<<p->c<<" "; } 14 void clear() { A->r=B; B->l=A; } 15 16 List(int N=0) 17 { 18 A=make(); B=add(); 19 for(int x,i=1;i<=N;++i) { cin>>x; add(x); } 20 } 21 ~List() { clear(); } 22 };
posted on 2014-12-04 08:42 IceDream61 阅读(786) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端