C语言双层链表
来源:互联网 发布:ios清除文稿与数据 编辑:程序博客网 时间:2024/05/17 22:14
第二篇博客:自学完C也有20来天了,最近都在学C++,今天在C++中偶然间看到了链表,就心血来潮想着自己写个双层链表,检验下C的链表学得怎么样,写完就迫不及待传到博客上了,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。要说CSDN博客真是个好东西,互相分享心得,笔记,互相学习,还方便自己以后查阅。
双层链表:链表的每一个节点中都存放着一个链表。
#include"double node.h"#include<stdio.h>#include<stdlib.h>#include<array>#include<iostream>using namespace std;//头文件#include"double node.h"中的代码如下:struct smallnode //内层链表 {int num; //编号int data; //存放的数据struct smallnode *pnext;//指向下一个内层链表节点};typedef struct smallnode Smallnode;struct bignode //外层链表 每个节点中存有一个内层链表{int num; //编号struct smallnode *pheadsmall; //指向内层链表的头节点struct bignode *pnext; //指向下一个外层链表节点};typedef struct bignode Bignode;void main(){array<int, 10> array = { 0,1,2,3,4,5,6,7,8,9 };Bignode *pheadBnode; //存储外层链表头节点Bignode *pBnode; //存储开辟内存后的节点地址Smallnode *pSnode; //存储开辟内存后的节点地址Bignode *pBtemp; //副本存储上一节点地址Smallnode *pStemp; //副本存储上一节点地址/**********************************************为外层头节点开辟内存**********************************************/pBnode = (Bignode *)malloc(sizeof(Bignode)); //为外层链表头节点分配内存pBtemp = pBnode; //记录地址 用于改变下一节点指针指向pBnode->num = 0;pBnode->pnext = NULL;pSnode = (Smallnode *)malloc(sizeof(Smallnode)); //为内层链表头节点分配内存pBnode->pheadsmall = pSnode; //存储内层链表头节点pheadBnode = pBnode; //记录头节点 用于打印数据pStemp = pSnode; //记录地址pSnode->num = 0;pSnode->data = array[0];pSnode->pnext = NULL;for (int j = 1; j < 10; j++){pSnode = (Smallnode *)malloc(sizeof(Smallnode)); //为内层链表节点分配内存pStemp->pnext = pSnode; //前面已经赋值pStemp = pSnode; 这里就是给上一节点的pnext赋值 指向当前分配的节点地址pStemp = pSnode; //改变副本存储的地址pSnode->num = j;pSnode->data = array[j];pSnode->pnext = NULL;}/**********************************************为其余外层节点开辟内存**********************************************/for (int i = 1; i < 10; i++){pBnode = (Bignode *)malloc(sizeof(Bignode)); //为外层链表节点分配内存pBtemp->pnext = pBnode;pBtemp = pBnode; //改变副本存储的地址pBnode->num = i;pBnode->pnext = NULL;pSnode = (Smallnode *)malloc(sizeof(Smallnode));//为内层链表节点分配内存pBnode->pheadsmall = pSnode; //存储内层链表头节点pStemp = pSnode; //记录地址pSnode->num = 0;pSnode->data = array[0];pSnode->pnext = NULL;for (int k = 1; k < 10; k++){pSnode = (Smallnode *)malloc(sizeof(Smallnode));//为内层链表节点分配内存pStemp->pnext = pSnode;pStemp = pSnode; //改变副本存储的地址pSnode->num = k;pSnode->data = array[k];pSnode->pnext = NULL;}}/**********************************************打印链表数据 验证正确与否**********************************************/for (int h = 0; h < 10; h++){pSnode = pheadBnode->pheadsmall; //指向内层链表头节点cout << "当前外层节点地址: " << pheadBnode << " " << "下一外层节点地址: " << pheadBnode->pnext << " " << "当前外层节点编号: " << pheadBnode->num << endl;cout << "\n";for (int g = 0; g < 10; g++){cout << "当前内层节点地址: " << pSnode << " " << "下一内层节点地址: " << pSnode->pnext << " " << "当前内层节点存储的数据: " << pSnode->data << endl;pSnode = pSnode->pnext;}cout << "\n\n\n";pheadBnode = pheadBnode->pnext; //指向下一外层节点}cin.get();//system("pause");}//这里解释下为什么要把外层头节点和外层其余节点分开写://******************************头节点中,是这样的******************************//pBnode = (Bignode *)malloc(sizeof(Bignode)); //为外层链表头节点分配内存 //pBtemp = pBnode; //记录地址 用于改变下一节点指针指向 1//pBnode->num = 0; 2//pBnode->pnext = NULL; 3//pSnode = (Smallnode *)malloc(sizeof(Smallnode));//为内层链表头节点分配内存 4//pBnode->pheadsmall = pSnode; //存储内层链表头节点 5//pheadBnode = pBnode; //记录头节点 用于打印数据 6//pStemp = pSnode; //记录地址 7//pSnode->num = 0; 8 //pSnode->data = array[0]; //pSnode->pnext = NULL;//*********************************其余节点,是这样的********************************//for (int i = 1; i < 10; i++)//{//pBnode = (Bignode *)malloc(sizeof(Bignode)); //为外层链表节点分配内存//pBtemp->pnext = pBnode; 11//pBtemp = pBnode; //改变副本存储的地址 12 //pBnode->num = i; 13//pBnode->pnext = NULL; 14//pSnode = (Smallnode *)malloc(sizeof(Smallnode));//为内层链表节点分配内存 15//pBnode->pheadsmall = pSnode; //存储内层链表头节点 16//pStemp = pSnode; //记录地址 17//pSnode->num = 0; 18//pSnode->data = array[0];//pSnode->pnext = NULL;//细微的差别就在于外层头节点前面没有节点,所以标号2处 只是记录当前外层节点的地址 //而其余外层节点之前都有节点 所以标号12,13处 先给上一外层节点的pnext赋值 再改变pBtemp的指向//标号6处是为了后面方便打印链表 存储头节点用的 可以无视//同理也要把内层头节点和内层其余节点分开写
在校学生一枚,写得不好的地方还请指正
在校学生一枚,写得不好的地方还请指正
0 0
- C语言双层链表
- BP算法(C语言)实现神经网络(双层感知机)
- 话中带话,双层含义的语言。
- C语言链表
- c语言链表
- C语言链表
- c语言链表
- C语言链表
- c语言链表
- C语言链表
- C语言链表
- C语言链表
- c语言链表
- c语言链表
- c语言链表
- c语言链表
- c语言链表
- C语言链表
- linux第三课
- |洛谷|NOIP2014|模拟|P1328 生活大爆炸版石头剪刀布
- GL Studio学习
- 剑指offer_输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
- Hadoop WordCount
- C语言双层链表
- 在ros中使用zlib解压或者压缩数据该如何配置cmakelists
- SpringMVC统一异常处理(返回异常数据而不是跳转到某个页面的方法)
- Vlc.DotNet C#音视频播放器使用说明及简单实例
- 单例模式
- [LeetCode]238. Product of Array Except Self
- JavaEE环境配置
- 活动与服务间通信
- 智慧北京:引导页面静态点的添加