数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长
Posted 一串字符串
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长相关的知识,希望对你有一定的参考价值。
1:双链表的建立,打印,代码如下:
// ConsoleApplication24.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //双向链表结构体 { int data;//节点数据 DbNode *left;//前驱节点指针 DbNode *right;//后继节点指针 }DbNode; DbNode *CreateNode(int data)//创建一个节点,返回新创建的节点 { DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = pnode;//初始化的节点的前驱和后继都等于本身的地址 /*---测试--- cout << "新创建节点的数据:"<<pnode->data << endl; cout << "新创建节点的地址:" << pnode << endl; cout << "新创建节点的前驱:" << pnode->left << endl; cout << "新创建节点的后继:" << pnode->right << endl; cout << "**********************************" << endl; ---*/ return pnode; } DbNode *CreateList(int head)//创建一个链表头,参数给出表头节点数据,表头节点不作为存放有意义数据的节点 { DbNode *pnode= (DbNode*)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = pnode; pnode->right = NULL; /*---测试--- cout << "链表头数据:" << pnode->data << endl; cout << "链表头的地址:" << pnode << endl; cout << "链表头的前驱:" << pnode->left << endl; cout << "链表头的后继:" << pnode->right << endl; cout << "**********************************" << endl; ---*/ return pnode; } /*插入新节点,总是在表尾插入;返回表头节点*/ DbNode *AppendNode(DbNode *head, int data)//参数1是链表的表头节点,参数2是要插入的节点,其数据为data { DbNode *node = CreateNode(data);//创建数据为data的新节点 DbNode *p = head, *q=NULL; while (p != NULL)//循环结束后,最后一个节点是q,p是q的right { q = p; p = p->right; } /*---在双向链表尾部插入新节点的方法---*/ q->right = node; node->left = q; node->right = NULL; /*---*/ /*---测试--- cout << "新插入的数据:" << node->data << endl; cout << "新插入的地址:" << node << endl; cout << "新插入的前驱:" << node->left << endl; cout << "新插入的后继:" << node->right << endl; cout << "**********************************" << endl; ---*/ return head; } void PrintList(DbNode *head)//打印整个链表 { DbNode *pnode = NULL; if (head == NULL)//链表为空 { return; } pnode = head; while (pnode != NULL) { printf("%d", pnode->data); pnode = pnode->right; } printf("\\n"); } int main() { /*---生成从0-9含有10个节点的循环链表---*/ DbNode *head = CreateList(0);//生成链表头 for (int i = 1; i < 10; i++) { head = AppendNode(head, i);//添加9个节点,数据为从1到9 } PrintList(head); return 0; }
运行结果:
2:双链表的测长,代码如下:
// ConsoleApplication24.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<malloc.h> #include <iostream> #include <assert.h> using namespace std; typedef struct DbNode //双向链表结构体 { int data;//节点数据 DbNode *left;//前驱节点指针 DbNode *right;//后继节点指针 }DbNode; DbNode *CreateNode(int data)//创建一个节点,返回新创建的节点 { DbNode *pnode = (DbNode*)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = pnode;//初始化的节点的前驱和后继都等于本身的地址 return pnode; } DbNode *CreateList(int head)//创建一个链表头,参数给出表头节点数据,表头节点不作为存放有意义数据的节点 { DbNode *pnode= (DbNode*)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = pnode; pnode->right = NULL; return pnode; } /*插入新节点,总是在表尾插入;返回表头节点*/ DbNode *AppendNode(DbNode *head, int data)//参数1是链表的表头节点,参数2是要插入的节点,其数据为data { DbNode *node = CreateNode(data);//创建数据为data的新节点 DbNode *p = head, *q=NULL; while (p != NULL)//循环结束后,最后一个节点是q,p是q的right { q = p; p = p->right; } /*---在双向链表尾部插入新节点的方法---*/ q->right = node; node->left = q; node->right = NULL; /*---*/ return head; } void PrintList(DbNode *head)//打印整个链表 { DbNode *pnode = NULL; if (head == NULL)//链表为空 { return; } pnode = head; while (pnode != NULL) { printf("%d", pnode->data); pnode = pnode->right; } printf("\\n"); } int GetLength(DbNode *head)//双向链表的测长,参数为链表头节点 { int count = 1; DbNode *pnode = NULL; if (head==NULL)//head为NULL表示链表空 { return 0; } pnode = head->right; while (pnode != NULL) { pnode = pnode->right;//使用right指针遍历 count++; } return count; } int main() { /*---生成从0-9含有10个节点的循环链表---*/ DbNode *head = CreateList(0);//生成链表头 for (int i = 1; i < 10; i++) { head = AppendNode(head, i);//添加9个节点,数据为从1到9 } PrintList(head); cout << "链表的长度为:" << GetLength(head) << endl; return 0; }
运行结果:
以上是关于数据结构-编程实现一个双链表的建立,双链表的打印,双链表的测长的主要内容,如果未能解决你的问题,请参考以下文章