#include <iostream> using namespace std; typedef int ElmType; const int length=10; typedef struct node { ElmType i; struct node* next; struct node* back; }Node; typedef Node* pNode; void init(pNode&,int); //初始化双链表 bool traverse(pNode); //前后遍历双链表 void insert(pNode&,int); //在节点p后插入 void del(pNode&); //删除节点p void collect_space(pNode head); void main() { pNode head,p; //生成一个未初始化的Node类型头指针 init(head,length);//建立双向链表,其中包括初始化head指针 p=head->next->next; insert(p,1); traverse(head); //遍历 getchar(); //按任意键退出 collect_space(head); //收回链表空间 } void init(pNode &head,int max_num) { head=(Node*)malloc(sizeof(Node)); head->i=0; head->back=NULL; head->next=NULL; Node *p,*temp; p=head; for(int i=1;i<max_num;i++) { temp=(Node*)malloc(sizeof(Node)); temp->i=i; temp->back=p; temp->next=NULL; p->next=temp; p=temp; } } bool traverse(pNode head) { if(head==NULL) { cout<<"输入的head为空"<<endl; return false; } while(head!=NULL) { cout<<head->i<<" "; head=head->next; } return true; } void del(pNode &p) { if(p==NULL) { cout<<"你输入的指针为空"<<endl; return; } Node *temp=p; if(p->next==NULL) { //如果删除的是尾指针,那么删除p后,p所指向位置自动前移一位 if(p->back==NULL) { cout<<endl<<"链表已清空"<<endl; free(p); p=NULL; return; } else { p=temp->back; p->next=NULL; free(temp); } } else if(p->back==NULL) { //如果删除的是头指针,那么删除p后,p所指向位置向后移一位 p=temp->next; p->back=NULL; free(temp); } else { //如果删除的是中间位置的,那么删除p后,p指向位置向前移一位 p=temp->next; temp->back->next=p; p->back=temp->back; free(temp); } } void insert(pNode &p,int n) { if(p==NULL) { cout<<"链表为空!"<<endl; return; } pNode temp=(pNode)malloc(sizeof(Node)); temp->i=n; if(p->next==NULL) { p->next=temp; temp->next=NULL; temp->back=p; } else { temp->next=p->next; temp->back=p; p->next->back=temp; p->next=temp; } } void collect_space(pNode head) { while(head!=NULL) { del(head); } }
双向链表的源码实现
最新推荐文章于 2021-10-13 22:43:41 发布