一些常用的链表结构
循环链表
特点:表中最后一个结点的指针域指向头结点,整个链表形成一个环。
循环链表的操作和单链表基本一致,差别仅在于终止条件不同。
在单链表中,判别条件为p!=NULL或p->next!=NULL,而循环单链表的判别条件为p!=L或p->next!=L。
双向链表
特点:克服单链表单向性的缺点。
#include<iostream> using namespace std; typedef int ElemType; typedef struct DuLNode{ ElemType data; //数据域 struct DuLNode *prior; //直接前驱 struct DuLNode *next; //直接后继 }DuLNode,*DuLinkList; //带头结点的双向链表的初始化 void initDulLinkList(DuLinkList &L){ L=new DuLNode; L->next=NULL; L->prior=NULL; } //头插法 逆序 DuLNode *CreateDulLinkList_H1(DuLinkList &L,int number){ initDulLinkList(L); for(int i=0;i<number;i++){ DuLinkList q=new DuLNode; cin>>q->data; //插入第一个结点单独讨论 if(L->next==NULL){ q->next=L->next; L->next=q; q->prior=L; }else{ q->next=L->next; L->next->prior=q; //这一行要特别注意 L->next=q; q->prior=L; } } return L; } //尾插法1 插入number个元素 顺序 DuLNode *CreateDulLinkList_T1(DuLinkList &L,int number){ initDulLinkList(L); DuLNode *p=L; for(int i=0;i<number;i++){ DuLinkList q=new DuLNode; p->next=q; cin>>q->data; q->prior=L; q->next=NULL; p=q; } return L; } // 尾插法2 顺序 DuLNode *CreateDulLinkList_T(DuLinkList &L,int number){ initDulLinkList(L); DuLNode *p=L; for(int i=0;i<number;i++){ DuLinkList q=new DuLNode; cin>>q->data; q->next=NULL; q->prior=p; p->next=q; p=q; } return L; } //遍历 void OutputLinkList(DuLinkList L){ DuLNode *p=L->next; while(p!=NULL){ cout<<p->data<<" "; p=p->next; } } //获取双向链表L中的i个位置的元素 DuLNode *GetElem_DuL(DuLinkList L,int i){ DuLNode *p; p=L; for(int j=1;j<i;j++){ p=p->next; } return p; } //双向链表的插入 需要修改四个指针 void ListInsert_DuL(DuLinkList &L,int i,ElemType e){ //在带头结点的双向链表L中第i个位置之前插入元素e DuLNode *p; if(!(p=GetElem_DuL(L,i))) //p为NULL时,第i个元素不存在 perror("error"); DuLNode *s=new DuLNode;//生成新结点*s s->data=e; s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; } //双向链表的删除 void ListDelete_DuL(DuLinkList &L,int i){ //删除带头结点的双向链表L中的第i个元素 DuLNode *p; if(!(p=GetElem_DuL(L,i))) //p为NULL时,第i个元素不存在 perror("error"); p->prior->next=p->next; p->next->prior=p->prior; delete p; } int main(){ //以插入5个数为例 int number=5; DuLNode *L; //尾插法2 //DuLNode * DL=CreateDulLinkList_T(L,number); //尾插法1 //DuLNode *DL=CreateDulLinkList_T1(L,number); DuLNode *DL=CreateDulLinkList_H1(L,number); OutputLinkList(L); return 0; }