#include <iostream>
using namespace std;
/*
对于链表的话,单链表和双向链表,算法导论里面是按照双向链表来进行的,且是无序的。
*/
/****************无哨兵的情况**********************/
struct node
{
node* prev;
node* next;
int key;
node(int k):key(k),prev(NULL),next(NULL){
}
};
struct List
{
node* head;
List():head(NULL){
}
};
void list_inset(List list,node* ln)
{//插入的话仅仅是在链表的头部插入;
ln->next=list.head;
if(list.head!=NULL)
{
list.head->prev=ln;
}
list.head=ln;//修改头部名字。
ln->prev=NULL;
}
node* list_search(List list,int k)
{
node* p=list.head;
while (p!=NULL&&p->key!=k)
{
p=p->next;
}
return p;
}
void list_delete(List list,node* ln)
{
if (ln->prev!=NULL)//是否是首尾的
{
ln->prev->next=ln->next;
}else
{
list.head=ln->next;
}
if(ln->next!=NULL)
{
ln->next->prev=ln->prev;
}
}
void print(List list)
{
node *p=list.head;
while (p!=NULL)
{
cout<<p->key<<" ";
p=p->next;
}
cout<<endl;
}
/*---------------有哨兵-----------------------------*/
struct LIST
{
node nil;
LIST(){
nil.prev=NULL;
nil.next=NULL;
nil.key=0;
}
};
void LIST_delete(LIST lst,node *pn)
{
pn->next->prev=pn->prev;
pn->prev->next=pn->next;
}
void LIST_insert(LIST lst,node* pn)
{
pn->next=lst.nil.next;
lst.nil.next->prev=pn;
pn->prev=lst.nil;
lst.nil->next=pn;;
}
node* LIST_search(LIST lst,int key)
{
node* p=lst.nil->next;
while (*p!=lst.nil&&p->key!=key)
{
p=p->next;
}
return p;
}
int main()
{
List list;
node* p1=new node(1);
node* p2=new node(2);
node* p3=new node(3);
list_inset(list,p1);
list_inset(list,p2);
list_inset(list,p3);
print(list);
cout<<"-------------"<<endl;
cout<<list_search(list,2)<<endl;
cout<<"-------------"<<endl;
list_delete(list,p2);
print(list);
cout<<"finished !"<<endl;
return 0;
}
链表
最新推荐文章于 2024-06-14 09:15:00 发布