数据结构笔记1---链表与顺序表
来源:互联网 发布:mac cocos 环境搭建 编辑:程序博客网 时间:2024/05/15 17:12
导读
1.单链表(创建,插入,删除,查找(2),判空)
2.数组线性表(创建,插入,删除,查找,判空,判满)
3.循环链表(创建,插入,删除,判空)
4.运用数组线性表的串的替换暴力算法
单链表
#include <iostream>using namespace std;typedef struct LNode *List;struct LNode{ int data;//以int为例 List next;};//创建空链表List create(){ List head=new LNode; head->next=NULL; return head;}//判空bool Isempty(List head){ if(head->next==NULL) return true; else return false;}//返回链表长度int Length(List head){ int result=0; List p=head->next; while(p!=NULL){ result++; p=p->next; } return result;}//查找第k个元素并返回其指针List Findkth(List head,int k){ if(Isempty(head)){ cout<<"It's empty!"<<endl; return NULL; } List p=head; int i=0; while(p!=NULL&&i<k){ p=p->next; i++; } if(p==NULL) { cout<<"There is not such a data!"<<endl; return NULL; } else return p;}//查找数值为i的元素并返回其指针List Findelem(List head,int i){ if(Isempty(head)){ cout<<"It's empty!"<<endl; return NULL; } List p=head->next; while(p!=NULL&&p->data!=i) p=p->next; if(p==NULL) //注意这里if与else的位置很重要,如果不先判定p为空很有可能报错 { cout<<"There is not such a data!"<<endl; return NULL; } else return p;}//插入元素,元素按照非递减排序void Insert(List &head,int data){ List p=head; List s=new LNode; s->data=data; while(p->next!=NULL&&p->next->data<data) p=p->next; s->next=p->next; p->next=s;}//删除一个元素,这里用return 的效率不如用引用的效率高void Deletedata(List &head,int data){ List p=head; List s; if(Isempty(head)) cout<<"It's empty!"<<endl; while(p->next!=NULL&&p->next->data!=data) p=p->next; if(p->next->data==data){ s=p->next; p->next=p->next->next; delete(s); } else cout<<"There is not such a data!"<<endl;}int main(){ List chain; List p; chain=create(); for(int i=1;i<=10;i++) { Insert(chain,i); } cout<<"链表长度:"<<endl; cout<<Length(chain)<<endl; cout<<"查找第5个元素:"<<endl; p=Findkth(chain,5); cout<<p->data<<endl; cout<<"查找元素7:"<<endl; p=Findelem(chain,7); cout<<p->data<<endl; cout<<"删除元素8"<<endl; Deletedata(chain,8); cout<<"查找元素8"<<endl; p=Findelem(chain,8); return 0;}
输出结果
链表长度:
10
查找第5个元素:
5
查找元素7:
7
删除元素8
查找元素8
There is not such a data!
Program ended with exit code: 0
数组线性表
#include <iostream>using namespace std;#define MAXSIZE 100typedef struct Node *snode;struct Node{ char data[MAXSIZE+1]; int length;};//数组初始化snode init(){ snode head=new Node; head->length=0; return head;}//判空bool Isempty(snode head){ bool flag=false; if(head->length==0) flag=true; return flag;}//判满bool Isfull(snode head){ bool flag=false; if(head->length==MAXSIZE) flag=true; return flag;}//插入数据void insert(snode &head,char data){ int i; for(i=1;i<=head->length&&head->data[i]<data;) {i++;} if(i>head->length) head->data[i]=data; else{ i--; for(int j=head->length;j>=i;j--){ head->data[j+1]=head->data[j]; } head->data[i]=data; } head->length++;}//删除数据void del(snode &head,char data){ for(int i=1;i<=head->length;i++){ if(head->data[i]==data){ for(int j=i;j<=head->length;j++) head->data[j]=head->data[j+1]; head->length--; } }}//查找数据void find(snode &head,char data){ bool flag=false; for(int i=1;i<=head->length;i++){ if(head->data[i]==data){ cout<<"yes,it's here.The position is "<<i<<endl; flag=true; } } if(flag==false) cout<<"There is not such a data"<<endl;}int main(){ snode list; list=init(); for(char i='a';i<='m';i++){ insert(list,i); } find(list,'k'); del(list,'k'); find(list,'k'); return 0;}
输出结果
yes,it’s here.The position is 11
There is not such a data
Program ended with exit code: 0
循环链表
以约瑟夫环为例:
输入:人数n,(编号为1~n),约瑟夫环数m(每m人淘汰一次)
输出:按照出圈顺序打印编号
#include <iostream>using namespace std;typedef struct Node *List;struct Node{ int num; List next;};//创建循环链表List init(int num){ List flag=new Node; flag->num=num; flag->next=flag; return flag;}//判空bool Isempty(List flag){ if(flag) return false; else return true;}//插入元素void insert(int num,List &flag){ List s=new Node; s->num=num; s->next=flag->next; flag->next=s; flag=s;}//删除第k个元素void del(List &flag,int k){ if(Isempty(flag)) cout<<"it's empty!"<<endl; List p=flag; //循环链表删除要分k=1和k>1两种情况 if(k==1){ List p1=flag; while(p->next!=flag) p=p->next; p->next=flag->next; flag=flag->next; cout<<p1->num<<endl; delete(p1); } else{ List p2; for(int i=1;i<=k-2;i++) p=p->next; p2=p->next; p->next=p->next->next; flag=p->next; cout<<p2->num<<endl; delete(p2); }}//如果每次删除的k都不同,则需要将k定义为引用类型int main(){ List flag; int n,m; cout<<"输入人数n和淘汰数m:"<<endl; cin>>n>>m; flag=init(1); for(int i=2;i<=n;i++){ insert(i,flag); } flag=flag->next;//此步用于回到第1个人的位置 for(int i=1;i<=n;i++) del(flag,m); return 0;}
输出结果
输入人数n和淘汰数m:
3 3
3
1
2
Program ended with exit code: 0
运用数组线性表的串的替换暴力算法
#include <iostream>using namespace std;#define MAXSIZE 100struct chuan{ char data[MAXSIZE+1]; int length;};bool compare(char a,char b){ if(a==b) return true; else return false;}//暴力匹配算法int match(chuan S,chuan T,int start){ int flag,i,j; for(flag=start;flag<=S.length-T.length+1;flag++) { for(j=1,i=flag;j<=T.length;i++,j++){ if(compare(S.data[i],T.data[j])==false) break; } if(j>T.length) break; } if(flag>S.length-T.length+1) return 0;//匹配失败返回0 return flag;//匹配成功返回位置}//替换算法void replace(chuan &S,chuan T,chuan V,int flag){ //1.替换串与被替换串长度一样 if(T.length==V.length){ for(int i=flag,j=1;i<=T.length;i++,j++) S.data[i]=V.data[j]; } //2.替换串长度小于被替换串 else if(T.length>V.length){ int k=T.length-V.length; //要缩短的长度 for( int i=flag+V.length;i<=S.length-T.length+V.length;i++){ S.data[i]=S.data[i+k]; } for(int i=flag,j=1;j<=V.length;i++,j++) S.data[i]=V.data[j]; S.length-=k; } //3.替换串长度大于被替换串 else{ int k=V.length-T.length; //要增加的长度 for(int i=S.length;i>=flag+T.length;i--){ S.data[i+k]=S.data[i]; } for(int i=flag,j=1;j<=V.length;i++,j++){ S.data[i]=V.data[j]; } S.length+=k; }}//打印函数void output(chuan S){ for(int i=1;i<=S.length;i++) cout<<S.data[i]; cout<<endl;}int main(){ chuan S,T,V; char a; int len=0; cout<<"请输入主串:"<<endl; while((a=getchar())!='\n') { len++; S.data[len]=a; } S.length=len; len=0; cout<<"请输入被替换串:"<<endl; while((a=getchar())!='\n') { len++; T.data[len]=a; } T.length=len; len=0; cout<<"请输入替换串:"<<endl; while((a=getchar())!='\n') { len++; V.data[len]=a; } V.length=len; output(S); int i=1; //一个主串里可能有多个被替换串 while(i<=S.length-T.length+1){ i=match(S,T,i); if(i!=0) { replace(S,T,V,i); i+=V.length; } else break; } output(S); return 0;}
输出结果
请输入主串:
retioioret
请输入被替换串:
ret
请输入替换串:
df
retioioret
dfioiodf
Program ended with exit code: 0
阅读全文
0 0
- 数据结构笔记1---链表与顺序表
- 数据结构笔记--顺序表
- 数据结构笔记(1)-顺序表
- 数据结构学习笔记:顺序表
- 数据结构笔记之顺序表
- 数据结构与算法--顺序表
- 数据结构《顺序链表》
- 数据结构顺序链表
- 【数据结构1】顺序表
- 数据结构 【1】 顺序表
- 数据结构学习笔记1-线性表(顺序表,单链表)
- 数据结构学习笔记1——顺序表
- 数据结构学习笔记二 顺序表
- 数据结构之顺序表学习笔记
- 【黑马程序员-学习笔记】数据结构-顺序表
- 数据结构学习笔记(一) 顺序表
- 数据结构学习笔记之顺序表
- 数据结构学习笔记(一) 顺序表
- Linux运维人员最常用 150 个命令汇总
- 合理使用缓存减少对服务器的访问之Cache-Control
- WritePrivateProfileString转WritePrivateProfileInt,在window写ini文本
- angular服务2
- 缪雪峰Pyhong——装饰器作业
- 数据结构笔记1---链表与顺序表
- MyBatis——动态SQL简介
- LeetcodeOJ 391 :Perfect Rectangle
- Homography
- STM32--按键
- Cg Programming/Unity/Translucent Bodies半透明体
- ArrayList、HashMap等初始空间大小
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法
- UVA