双向链表操作
来源:互联网 发布: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;}
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表基本操作
- java 操作双向链表
- 双向循环链表操作
- 双向循环链表操作
- [C++]双向链表操作
- 双向链表的操作
- 双向链表的操作
- 双向链表的操作
- 双向链表简单操作
- java 操作双向链表
- 双向链表--主要操作
- 双向链表基本操作
- 双向链表基本操作
- 处理器——半导体巅峰,纵横四十年
- XML第三课
- NDIS Passthru转发数据包开发小记(1)
- 在同一个解决方案下,如何从一个工程中调用另外一个工程的函数
- css与xml的连接
- 双向链表操作
- BDF字体规范
- MySql用户角色管理及权限分配(使用MySQLMembershipProvider和MySqlRoleProvider)
- 清除VS2008的缓存文件
- the day after tomorrow
- 数据结构之单链表
- <s:action>未执行问题
- 聚类分析之距离计算(二)
- Android 四大组件 及其理解