C++ 结构体指针理解

上一篇基础链接 https://www.cnblogs.com/xuexidememeda/p/12283845.html

主要说一下链表里面双重指针

先说一下结构体

typedef struct LNode
{
	int data;
	struct LNode *next;

}LNode, *LinkList;

typedef 把这个结构体定义一个别的名字 
LNode==LNode 类型     LinkList==LNode* 类型
你不定义typedef一样直接可以用LNode 就是写的时候不方便 但是我觉得对新手易于理解

  


先上总代码 两个main12是测试函数 自己改着玩

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<malloc.h>
using namespace std;

typedef struct LNode
{
    int data;
    struct LNode *next;

}LNode, *LinkList;


//--------------后插法创建单链表 ------------------
void CreateList_E(LinkList &head, int n)
{
    int i;
    LinkList pnew;
    LinkList pend;//定义最后的节点指针; 
    //先建立头结点,数据为空;
    
    head = new LNode;
    head->next = NULL;
    pend = head;//头结点是最后的节点 ;
    for (i = 0; i < n; i++)
    {
        pnew = new LNode;
        printf("请输入第%d个节点的数据:\n",i);
        scanf_s("%d", &pnew->data);
        pnew->next = NULL;
        pend->next = pnew;
        pend = pnew;

    }
}

void CreateList_E1(LNode* &head, int n)
{
    int i;
    LinkList* ptr;
    LinkList pnew;
    LinkList pend;//定义最后的节点指针; 
    //先建立头结点,数据为空;

    head = new LNode;  //返回的是分配空间的首地址LNode* 类型
    head->next = NULL;
    pend = head;//头结点是最后的节点 ;
    for (i = 0; i < n; i++)
    {
        pnew = new LNode;
        printf("请输入第%d个节点的数据:\n", i);
        scanf_s("%d", &pnew->data);
        pnew->next = NULL;
        pend->next = pnew;
        pend = pnew;
    }

}
//双重指针 头结点貌似必须在外面创建??
void CreateList_E1(LNode** lnode, int n)
{
    LinkList head = *lnode;
    head->next = NULL;

    for (int i = 0; i < n; i++)
    {
        LNode* pnew = new LNode;
        printf("请输入第%d个节点的数据:\n", i);
        scanf_s("%d", &pnew->data);
        pnew->next = head->next;
        head->next = pnew;
    }


    


    

}



//------------------打印链表---------------- 
void PrintList(LinkList head)
{
    LinkList item;
    item = head;
    item = item->next;//这一步不是必须要做的,为了跳过头结点(没有数据) 
    while (item != NULL)
    {
        printf("----%d----\n", item->data);
        item = item->next;

    }
}
void main1()
{

    LNode*  L = NULL;
    int n;
    printf("输入要创建的链表结点个数:\n");
    scanf_s("%d", &n);
    CreateList_E1(L, n);
    printf("\n打印结果!\n");
    PrintList(L);

}

void main2()
{ 
    LNode* temp= new LNode;
    LNode**  L= &temp;
    int n;
    printf("输入要创建的链表结点个数:\n");
    scanf_s("%d", &n);
    CreateList_E1(L,n);
    printf("\n打印结果!\n");
    PrintList(*L);


}
int _tmain(int argc, _TCHAR* argv[])
{
    //main1();
    main2();
}
View Code

说一下创建+赋值链表函数(自己看着前面的看)

void CreateList_E(LinkList &head, int n)==void CreateList_E1(LNode* &head, int n)

LinkList 的类型其实是LNode* 类型 然后&head 是传参引用?好像是这样的(忘怎么说了)  如果你不带&符号只能在本函数打印出来赋值语句 在封装的函数是无法打印的

跟你的swap学过一个函数交换值他真实的值还是不变,多数人疑问就是我传的可是一个指针类型,他是一个地址呀!为什么还是传不过去呢 因为你的指针地址是在栈中分配空间用完就销毁呢( CreateLis函数运行结束main函数无法找到原来分配的地址)    只要头结点是在main函数中分配的那么他以后的指针在哪分配都没问题的..... 看似简单的一个问题,要 真正弄懂其实要看编译器怎么办的就是看汇编

(本人汇编基础不扎实自学的以后博客再补上!!)

唯一确定的是不加&函数call return 之后会 main函数无法得到指针的地址

void CreateList_E1(LNode** lnode, int n)   这个和CreateList_E(LinkList &head, int n) 差不多因为我们之前说过 加一个& 相当于类型后加个*

猜你喜欢

转载自www.cnblogs.com/xuexidememeda/p/12292480.html