双向链表操作

来源:互联网 发布:mac jenkins 配置 编辑:程序博客网 时间:2024/05/22 05:28
#include "stdafx.h"#include <iostream>//双向链表using namespace std;typedef struct Dbnode{int data;      //节点数据Dbnode *left;  //前驱结点指针Dbnode *right; //后继节点指针}Dbnode;//创建节点Dbnode *CreateNode(int data){Dbnode *pnode=new Dbnode;if (pnode==NULL){return NULL;}pnode->data=data;pnode->left=pnode->right=NULL;//新节点的前驱和后继指针都指向NULLreturn pnode;}//在表尾插入新节点,返回表头节点Dbnode *AppendNode(Dbnode *head,int data){if (head==NULL){return NULL;}Dbnode *phead=head;Dbnode *pnode=CreateNode(data);//创建一个新节点Dbnode *q=NULL;while (phead!=NULL){ //找到最后一个节点,插入到最后一个节点后面q=phead;//存放末节点phead=phead->right;}q->right=pnode;pnode->left=q;return head;}//打印双向链表void Print(Dbnode *head){if (NULL==head){ //head为NULL表示为空链表return;}Dbnode *p=head;while (p!=NULL){cout<<p->data<<" ";p=p->right;}cout<<endl;}//双向链表的测长int GetLength(Dbnode *head){if (head==NULL)//如果指针为空或链表为空,则返回0{return 0;}Dbnode *phead=head->right;int i=1;while (phead!=NULL){  phead=phead->right;   i++;}return i;}//双向链表的节点查找Dbnode *FindNode(Dbnode *head,int data){if (head==NULL){return NULL;}Dbnode *phead=head;Dbnode *pnode=NULL;while (phead->right!=NULL && phead->data!=data){phead=phead->right;}if (phead->data==data){//如果是值相等退出,则返回节点return phead;}else  //如果没有找到,则返回NULLreturn NULL;}//双向链表的节点插入//在node节点之后插入新节点void InsertNode(Dbnode *node,int data){if (node==NULL){return ;}Dbnode *p=CreateNode(data); //创建一个新节点if(node->right==NULL){ //node为最后一个节点node->right=p;p->left=node;}else{  //node为中间节点node->right->left=p; //p向左连接p->right=node->right;node->right=p;    //p向右连接p->left=node;}}//双向链表的节点删除,并返回表头节点//如果不存在节点,则删除失败返回NULL//如果删除后的链表为空,也返回NULLDbnode *DeleteNode(Dbnode *head,int data){          if (head==NULL){//链表不存在返回NULL          return NULL;                }Dbnode *pnode=FindNode(head,data);          if (NULL==pnode){ //查找节点,节点不存在,返回NULL         return NULL;               }        else if (pnode->left==NULL){ //node为头节点          head=pnode->right;  //使第一个节点为头节点                if (head!=NULL){ //链表不为空                 head->left=NULL;                      }               }        else if (pnode->right==NULL){//node为最后一个节点         pnode->left->right=NULL;               }         else{         pnode->left->right=pnode->right;         pnode->right->left=pnode->left;            }free(pnode); //释放已被删除的节点空间return head;}int _tmain(int argc, _TCHAR* argv[]){Dbnode *head=CreateNode(0);//创建表头节点,表头节点不作为存放有意义数据的节点for (int i=1;i<10;i++){AppendNode(head,i);}Print(head);cout<<"=======================\n";cout<<"The length:"<<GetLength(head)<<endl;cout<<"===========FindNode(4)============\n";Dbnode *pfind=FindNode(head,11);if (pfind==NULL){cout<<"no find!"<<endl;}elsecout<<"find!"<<endl;cout<<"===========InsertNode 32===========\n";   InsertNode(head->right->right->right,32);   Print(head); cout<<"==========DeleteNode 8=============\n"; Dbnode *pNhead=DeleteNode(head,8);    Print(pNhead);system("pause");delete [] head;return 0;}


 

原创粉丝点击