单链表,双向循环链表应用
2015-01-06 21:30
387 查看
//1单链表得简单那应用
#include<iostream> #include<malloc.h> using namespace std; #define false 0; #define true 1; typedef struct ElemType{ char name[30]; char mobile[30]; char addr[30]; }ElemType; typedef struct LNode{ ElemType data; LNode* next; }LNode,*LinkList; //带头节点得链表初始化操作 bool initLinkList(LinkList &L) { L=(LNode*)malloc(sizeof(LNode)); if(L) { L->next=NULL; return true; } else return false; } //判断单链表是否为空,空返回true,否则返回false bool IsEmpty(LinkList &L) { if(!(L->next)) return 1; else return false; } //查看链表得长度 int Length(LinkList L) { int length=0; LNode* p=L->next; while(p) { ++length; p=p->next; } return length; } //找到第i个节点所在的位置,p只想第i个元素的前驱 bool SearchPre(LinkList L,int i,LNode* p) { if(!L) return false; if(i>Length(L)+1||i<1) return false; p=L; for(;i>1;--i) p=p->next; } //在第i个节点前加入元素元素 bool Insert(LinkList &L, int i,ElemType e) { //位置不合理 if(i<1||i>Length(L)+1) //cout<<"Insert fail,because the index is not true!"<<endl; return false; //为待插入元素分配空间 LNode* elem=(LNode*)malloc(sizeof(LNode)); elem->data=e; LNode* p=NULL; SearchPre(L,i,p); elem->next=p->next;//插入 p->next=elem; return true; } //头插法 bool Insert(LinkList& L,ElemType e) { LNode* p=(LNode*)malloc(sizeof(LNode)); p->data=e; p->next=L->next; L->next=p; return 1; } //按姓名删除元素 bool deleteNode(LinkList &L,char* name) { int flag=0; LNode *p= L->next; LNode *pre= L;//始终指示p的前驱 if(!p) return false; while(p) { //delete所有的name域为给定值得元素。 if(!strcmp(name,p->data.name)) { pre->next=p->next; free(p); p=pre->next; flag=1; } else { p=p->next; pre=pre->next; } } if(flag) return 1; else return false; } //按姓名查找元素 bool search(LinkList L,LNode *&result,char* name) { LNode* p=L->next; if(!p) return false; while(p) { if(!strcmp(name,p->data.name)) { result=p; return true; } else p=p->next; } return false; } //输出所有元素的值 void print(LinkList L) { LNode * p=L->next; while(p) { cout<<"联系人为:"<<p->data.name<<",电话号码为:"<<p->data.mobile<<",家庭住址为:"<<p->data.addr<<endl; p=p->next; } } void destory(LinkList& L) { LNode* p=L->next; if(!p) return ; L->next=NULL; LNode*q=p->next; while(p) { free(p); p=q; q=q->next; } } void main() { int judge=0; int choice=0; ElemType elem; //char *phoneNumber=new char[30]; char name[30]; LinkList L; initLinkList(L); cout<<"请选择相关操作:1代表查询表中元素,2表中元素个数,3代表插入元素,4代表删除元素操作,5代表退出"<<endl; while(scanf("%d",&choice)!=EOF) { if(choice==1) { cout<<"请输入要查询对象的名字:"; cin>>name; LNode *p=NULL; judge=search(L,p,name); if(judge) { cout<<name<<"的信息为:"<<(*p).data.mobile<<", "<<(*p).data.addr<<endl; } else cout<<"表中没有你要查找的元素"<<endl; } else if(choice==2) cout<<"表中元素为"<<Length(L)<<"个"<<endl; else if(choice==3) { cout<<"请输入需要插入的相关信息。"<<endl; cout<<"姓名:"; cin>>elem.name; cout<<"电话号码:"; cin>>elem.mobile; cout<<"家庭地址:"; cin>>elem.addr; if(Insert(L,elem)) { cout<<"插入成功!"<<endl; print(L); } else cout<<"插入失败!"<<endl; } else if(choice==4) { cout<<"请输入要删除人物的姓名:"; cin>>name; if(deleteNode(L,name)) cout<<"删除成功!"<<endl; else cout<<"表中不含该人物!删除失败"<<endl; } else { destory(L); return ; } } }
上述是单链表写的电话本简单应用。
//2再写一个双向循环链表的应用
#include<iostream> #include<malloc.h> using namespace std; #define false 0; #define true 1; typedef struct DNode{ ElemType data; DNode* prior; DNode* next; }DNode,*DLinkList;
<p>typedef struct ElemType{ char name[30]; char mobile[30]; char addr[30]; }ElemType;</p><p> </p><p>初始化带头节点的双向循环链表 bool InitDList(DLinkList& L) { L=(DNode*)malloc(sizeof(DNode)); if(L) { L->prior=L; L->next=L; return true; } else return false; }</p><p> </p><p>bool IsEmpty(DLinkList L) { if(L->prior==L&&L->next==L) return 1; else return false; }</p><p> 表中元素个数 int Length(DLinkList L) { int length=0; if(IsEmpty(L)) return length; DNode* p=L; while(p->next!=L) { length++; p=p->next; } return length; }</p><p>插入元素 bool Insert(DLinkList &L,ElemType e) { DNode *elem=(DNode*)malloc(sizeof(DNode)); if(!elem) { cout<<"节点创建失败,overflow"<<endl; return false; } elem->data=e; elem->next=L->next; elem->prior=L; L->next->prior=elem; L->next=elem; return 1; }</p><p>删除元素 bool deleteNode(DLinkList &L,char* name) { DNode*p=L->next; if(p==L) { cout<<"表中没有元素,无法删除!"<<endl; return false; } while(p!=L) { if(!strcmp(p->data.name,name)) { p->prior->next=p->next; p->next->prior=p->prior; free(p); return 1; } p=p->next; } return false; } 按名字查找 bool search(DLinkList L,char*name) { DNode* p=L->next; while(p!=L) { if(!strcmp(name,p->data.name)) { cout<<name<<"的信息为:电话号码"<<p->data.mobile<<",地址为:"<<p->data.addr<<endl; return 1; } else p=p->next; } cout<<"表中不含该联系人信息。"<<endl; return false; }</p><p> 打印 void print(DLinkList L) { DNode *p=L->next; if(p==L) { cout<<"该表为空表!"<<endl; return ; } while(p!=L) { cout<<"姓名:"<<p->data.name<<",电话:"<<p->data.mobile<<",地址:"<<p->data.addr<<endl; p=p->next; } }</p><p>void distory(DLinkList& L) { DNode* p=L->next; DNode* q=p->next; while(p!=L) { free(p); p=q; q=q->next; } }</p><p> </p><p>int main() { int judge=0; ElemType elem; char name[30]; int choice=0; DLinkList L; InitDList(L); cout<<"请选择相关操作:1代表查询表中元素,2表中元素个数,3代表插入元素,4代表删除元素操作,5代表查看表中所有元素,6代表退出"<<endl; while(scanf("%d",&choice)!=EOF) { if(choice==1) { cout<<"请输入要查询对象的名字:"; cin>>name; DNode *p=NULL; search(L,name); } else if(choice==2) cout<<"表中元素为"<<Length(L)<<"个"<<endl; else if(choice==3) {</p><p> cout<<"请输入需要插入的相关信息。"<<endl; cout<<"姓名:";</p><p> cin>>elem.name; cout<<"电话号码:"; cin>>elem.mobile; cout<<"家庭地址:"; cin>>elem.addr; if(Insert(L,elem)) { cout<<"插入成功!"<<endl; print(L); } else cout<<"插入失败!"<<endl;</p><p> } else if(choice==4) { cout<<"请输入要删除人物的姓名:"; cin>>name; if(deleteNode(L,name)) cout<<"删除成功!"<<endl; else cout<<"表中不含该人物!删除失败"<<endl;</p><p> } else if(choice==5) { print(L); } else { distory(L); return 1; }</p><p> }</p><p> </p><p>}</p>
上述1,2两个文件均为cpp文件,可直接运行,后续会更新二叉排序树得类似应用。
相关文章推荐
- 单链表的应用2(单向循环链表变双向循环链表)
- 数据结构教程 第九课 循环链表与双向链表
- 循环链表与双向链表
- 线性表->循环链表, 双向链表
- 循环链表与双向链表
- 多文件编程动态开辟空间实现双向链表的应用 c++版
- 循环链表及双向链表的c语言实现
- 双向循环链表的应用
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- C语言-----链表的各项操作总结------双向循环链表
- UVa 12657 Boxes in a Line(双向链表的应用)
- js实现双向链表互联网机顶盒实战应用
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- C++ 标准模板库STL 双向链表 list 使用方法与应用介绍(一)
- List 双向链表容器基础应用
- 嵌入式C语言那点事(三)Linux中霸道的双向链表源码与应用
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
- 线性表实现:顺序表、链表、循环链表、双向循环链表
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除