以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?

问题描述

以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?

#include
using namespace std;

typedef struct Node
{
int age;
struct Node* next;
}LIST;

void addList1(LIST* pHead,int x)//链表结尾加节点
{
LIST* pM=new LIST();//新节点
pM->age=x;
pM->next=NULL;
if(pHead==NULL)
{
cout<<"List is NULL"<
cout
pHead=new LIST();//重新分配内存,头节点
pHead->age=0;
pHead->next=pM;
}
else
{
LIST* pCur=pHead->next;//当前节点
while(pCur!=NULL)
{
pCur=pCur->next;
}
pCur=pM;
}
}
LIST* CreatList1()//创建节点
{
int data=0;
LIST* Phead=NULL;
LIST* Pm=NULL;
LIST* Pcur=NULL;
cout<<"Enter your data of node (-1 quit):";
scanf("%d", &data);
if(data!=-1)
{
Phead=(LIST*)malloc(sizeof(LIST));
Phead->age=0;
Phead->next=NULL;
Pcur=Phead;
}
while (data!=-1)
{
Pm=new LIST();
Pm->age=data;
Pm->next=NULL;
Pcur->next=Pm;
Pcur=Pcur->next;
cout<<"Enter your data of node (-1 quit):";
cin>>data;
}
return Phead;
}

void ListOut1(LIST* Phead)//输出节点
{
LIST* p=NULL;

if(Phead==NULL)
{
    cout<<"List is NULLn";
}
else
{
    p=Phead->next;
    while(p!=NULL)
    {
        cout<<p->age<<endl;
        p=p->next;
    }
}

}

void main()
{
LIST* p1=CreatList1();
ListOut1(p1);
addList1(p1,100); //当输入链表为空时,初始化链表
ListOut1(p1); //此时输出为空? 为什么? 我不是在初始化时在堆中分配的内存 不是可以用吗?
system("pause");
}

解决方案

 // ConsoleApplication2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
using namespace std;

typedef struct Node
{
    int age;
    struct Node* next;
}LIST;

void addList1(LIST*& pHead, int x)//链表结尾加节点
{
    LIST* pM = new LIST();//新节点
    pM->age = x;
    pM->next = NULL;
    if (pHead == NULL)
    {
        cout << "List is NULL" << endl;
        cout << "Creat New List" << endl;
        pHead = new LIST();//重新分配内存,头节点
        pHead->age = 0;
        pHead->next = pM;
    }
    else
    {
        if (pHead->next == NULL)
        {
            pHead->age = x;
        }
        else
        {
            LIST* pCur = pHead->next;//当前节点
            while (pCur->next != NULL)
            {
                pCur = pCur->next;
            }
            pCur->next = pM;
        }
    }
}

LIST* CreatList1()//创建节点
{
    int data = 0;
    LIST* Phead = NULL;
    LIST* Pm = NULL;
    LIST* Pcur = NULL;
    cout << "Enter your data of node (-1 quit):";
    scanf_s("%d", &data);
    if (data != -1)
    {
        Phead = (LIST*)malloc(sizeof(LIST));
        Phead->age = 0;
        Phead->next = NULL;
        Pcur = Phead;
    }
    while (data != -1)
    {
        Pm = new LIST();
        Pm->age = data;
        Pm->next = NULL;
        Pcur->next = Pm;
        Pcur = Pcur->next;
        cout << "Enter your data of node (-1 quit):";
        cin >> data;
    }
    return Phead;
}

void ListOut1(LIST* Phead)//输出节点
{
    LIST* p = NULL;

    if (Phead == NULL)
    {
        cout << "List is NULLn";
    }
    else
    {
        p = Phead->next;
        while (p != NULL)
        {
            cout << p->age << endl;
            p = p->next;
        }
    }

}

void main()
{
    LIST* p1 = CreatList1();
    ListOut1(p1);
    addList1(p1, 100); //当输入链表为空时,初始化链表
    ListOut1(p1);      //此时输出为空?  为什么?  我不是在初始化时在堆中分配的内存  不是可以用吗?
    system("pause");
}

解决方案二:

 void addList1(LIST* pHead, int x)//链表结尾加节点
{
    LIST* pM = new LIST();//新节点
    pM->age = x;
    pM->next = NULL;
    if (pHead == NULL)
    {
        cout << "List is NULL" << endl;
        cout << "Creat New List" << endl;
        pHead = new LIST();//重新分配内存,头节点
        pHead->age = 0;
        pHead->next = pM;
    }
    else
    {
        LIST* pCur = pHead->next;//当前节点
        while (pCur->next != NULL)
        {
            pCur = pCur->next;
        }
        pCur->next = pM;
    }
}

解决方案三:

你的程序没有问题,只是添加节点不对,节点没有被添加到链表上。我修改了下

 Enter your data of node (-1 quit):1
Enter your data of node (-1 quit):2
Enter your data of node (-1 quit):3
Enter your data of node (-1 quit):4
Enter your data of node (-1 quit):5
Enter your data of node (-1 quit):6
Enter your data of node (-1 quit):-1
1
2
3
4
5
6
1
2
3
4
5
6
100
Press any key to continue . . .

解决方案四:

应该是传参有问题吧。应该是这样listadd1(&p1,100)

解决方案五:

主要是你在addList1()里面的“cout<<"List is NULL"< cout pHead=new LIST();//重新分配内存,头节点”,这里改变的pHead是局部变量,所以不会对主函数里的p1造成影响。如果想在子函数里改变指针,那么就要用2级指针把指针的地址传进去。

解决方案六:

用new分配的内存如果没有用delete收不是一直存在吗? 难道是因为在被调用函数里重新定义的链表,所以在主调函数里不能使用?

时间: 2024-10-27 09:21:59

以一个链表指针作参数传入一个函数里,若此时链表为空,则初始化链表,为什么在主函数中不能用?的相关文章

eWebEdito调用错误:无效的样式Style参数传入,如果要使用默认值,请留空!

eWebEditor调用出错,提示:"调用错误:无效的样式Style参数传入,如果要使用默认值,请留空!"  代码如下 复制代码 <IFRAME ID="tcontent" SRC="eWebEditor/ewebeditor.asp?id=tcontent&style=s_blue1" FRAMEBORDER="0" SCROLLING="no" WIDTH="100%"

当一个流做为参数传入另外一个流,需要关闭吗?例如本题的fo.close();

问题描述 //TestTransForm1.javaimportjava.io.*;publicclassTestTransForm1{publicstaticvoidmain(Stringargs[]){try{OutputStreamWriteros=null;FileOutputStreamfo=null;fo=newFileOutputStream("D:\corejava\417\1.txt");os=newOutputStreamWriter(fo);os.write(&q

c语言中怎么把一个大小不确定的二维数组当作参数传入函数中

问题描述 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中,取大神,取大神,取大神 解决方案 用VC++新建一个程序,默认生成的main函数定义如下 int mian(int argc, char* args[]) 这就是一个例子. 解决方案二: 一个表示长度的参数,一个指向二维数组的指针 解决方案三: fun(args[][],int rows,int cols) 解决方案四: void Func(int array[][10]

对象-请教一个MFC指针的问题

问题描述 请教一个MFC指针的问题 我看百度百科上面说的指针是一个对象,那请问下为什么咱们用指针的时候只是加个*号 就行了呢?为什么不用实例化这个对象呢? 解决方案 指针是指向的对象地址.*就是一个操作符.解引用.这样来访问对象.这个对象已经在其他地方实例化了.指针只是指向它 解决方案二: 一个关于指针的问题求教一个指针的问题:*pResult=0 解决方案三: 指针可不是对象. C++实例化对象不是new,new是分配内存. 在堆栈上分配,直接写 Class c(参数); 这就算实例化了.

java方法-java一个方法形参有两个,如何在调用的时候只传入一个参数

问题描述 java一个方法形参有两个,如何在调用的时候只传入一个参数 如题,有一个方法里两个形参,我另一个文件类中一个方法想要那个方法的返回值,可是第二个参数在这里用不到,能否只传第一个参数 如何实现,前提这个类不能继承后重写方法,因为多人合同写的. 解决方案 不可以,变通的办法是再写一个只有一个参数的函数重载形式,在其中给另一个参数一个预设值,间接调用. 解决方案二: 一个Action调用两个不同的方法 解决方案三: 调用的时候给一个无影响的值 解决方案四: 讲道理的话是不能这样做的,不过如果

配置一个bean获得工厂类产生的实例,通过参数传入学号

问题描述 配置一个bean获得工厂类产生的实例,通过参数传入学号 public static student getStudent(String sort){ student stu=new student(); stu.setStuId("未命名"); stu.setName("无名"); System.out.println("类型"+sort); return stu; } 解决方案 所以现在问题是在哪里?,, 解决方案二: 不知道该怎么配

c++-函数作参数,也可以不写成指针形式?

问题描述 函数作参数,也可以不写成指针形式? 下面的代码是书上的例子 main调用process再调arr 书上是用函数指针 然后我改了一下 发现不用指针 效果一样 但是网上一般都用指针形式 不用指针有什么弊端? #include <iostream> #include <cstdlib> using namespace std; #define N 5 /* void process(int* x, int n,int (*fun)(int*,int)) { int result

c++ 指针-一个c++指针的问题,要求编写一个函数

问题描述 一个c++指针的问题,要求编写一个函数 有这样一个题,要求编写一个函数,以char指针数组和数组中的指针数量作为参数,返回最长字符串的地址.我想请问这个函数的返回值的类型是什么呢?也就是说在声明函数时函数类型应该是char *** 还是其他呢?因为我认为 **char *** 指的是返回一个指向单个字符的指针而不是指向字符串的指针,而且这个函数怎么编写呢?以下是我写的源代码,虽然通过了编译,但是在运行时崩溃了 ** **char* maxn( char *** arr[],int le

线程-java中下面这段代码是一个匿名对象传入一个匿名对象在调用start方法吗

问题描述 java中下面这段代码是一个匿名对象传入一个匿名对象在调用start方法吗 new Thread(new Runnable() {.....省略代码若干..........}).start(); 上面这段代码是一个匿名对象传入一个匿名对象在调用start方法吗 还是一个匿名类传入一个匿名对象再调用start方法 我有点分不清匿名对象和匿名类呢 解决方案 new Runnable() {.....省略代码若干..........} 匿名类,因为Runnable是接口,需要实现类 new