双向循环链表的操作与实现……
网上关于这方面的挺多,由于自己以前上课没好好学数据结构,现在重新认识数据结构,
以下是自己写的基于C++的双向循环链表的创建及其一些操作与实现(于VC下通过),没用模板,
也没用类,所以比较适合有一点C++语言基础入门者,但可移植不够。有什么bug的话,欢迎指出。
或有什么问题也可以联系我。
made by virgil (2009.2.8)
MSN:[email protected])
#include <iostream> #include <cstdlib> using namespace std;
int N=10; struct Node { char name[20]; Node *llink,*rlink; };
Node* Create(int n) { Node *h,*p,*s; //h:头结点,p:下一结点,s:当前结点 int i; if((h=new Node)==NULL) { cout<<"分配内存失败..."<<endl; } h->name[0]=0; h->llink=NULL; h->rlink=NULL; p=h; for (i=0;i!=n;++i) { if((s=new Node)==NULL) { cout<<"分配内存失败..."<<endl; } p->rlink=s; cout<<"请输入第"<<i+1<<"个人的姓名:"; cin>>s->name; s->llink=p; s->rlink=NULL; p=s; } s->rlink=h; h->llink=s; return h; } Node* Search(Node* h,const char* name) { Node *p=h->rlink; for (int i=0;i!=N;++i) { if (strcmp(p->name,name)==0) { return p; } p=p->rlink; } return p; } void Insert(Node *p) { Node *s=new Node; cout<<"请输入要插入的姓名:"; cin>>s->name; Node *r=p->rlink; //结点示意 p->s->r(s为插入的结点) p->rlink=s; s->llink=p; r->llink=s; s->rlink=r; ++N; } void Delete(Node *p) { Node *l=p->llink; //结点示意 l->p->r (p为要删除的结点) Node *r=p->rlink; l->rlink=r; r->llink=l; delete p; --N; } void Display(Node *h) { Node *p; p=h->rlink; for (int i=0;i!=N;++i) { cout<<"第"<<i+1<<"个人的姓名:"<<p->name<<endl; // delete p; p=p->rlink; } }
int main() { Node *head,*pSearch; int number=N; char strName[20]; head=Create(number); cout<<endl;
cout<<"你创建的结构如下:"<<endl; Display(head); cout<<endl;
//查找并插入... cout<<"请输入你要查找的人的姓名:"; cin>>strName; pSearch=Search(head,strName); cout<<"你所要查找的人的姓名是: "<<pSearch->name<<endl; cout<<endl; Insert(pSearch); cout<<"插入后的结果如下:"<<endl; Display(head); cout<<endl;
//查找并删除... cout<<"输入你要删除的结点: "; cin>>strName; pSearch=Search(head,strName); Delete(pSearch); cout<<"删除后的结果如下:"<<endl; Display(head); cout<<endl; return 0; } |