//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文件,可直接运行,后续会更新二叉排序树得类似应用。