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
原创粉丝点击