C语言 链表 指针问题

C语言 链表 指针问题我做了一个题,题目要求一次性输入n(自己输入)个链表,然后逐行输出该链表反转(如1234转为4321)。我用循环输入了几个链表,并用自己设的新的头节点指向这个反转后的链表,然后将将这个新的头结点存入一个数组。但是输出结果却显示了n行我第n个链表的反转。于是我想实现将这个头结点存入数组后再清空他进入下一轮循环赋值,结果输出确实n行空。。。。。有没有什么办法删除指针但不释放他的内存?

1、删除指针,并不会释放他指向的内存地址。

2、如果你指向的地址还需要用,为什么要删除其指针。同一个地址可以有多个指针。

你可以在结构里定义2个链表指针,分别是正向和反向,这样你输入的的时候,就直接得到正反两个链表了。我写了案例,你参考吧。

#include <stdio.h>
#include <malloc.h>
#define size 5//你想输入的链表个数
typedef struct stt
{
    char num;
    struct stt *next0;//正向链表指针
    struct stt *next1;//反向链表指针
}STT;
STT **creatSTT();//创建一条链表,返回其正向链表首节点及尾节点组成的指针数组
void printSTT(STT *sttHead,int flag);//打印链表,flag=0打印正向链表,flag=1打印反向链表

int main()
{
    int n=size,i;
    STT *sttHead=(STT *)malloc(sizeof(STT)),*stt0[n],*stt1[n],**stts=NULL;
    for(i=0;i<n;i++)
    {
        stts=creatSTT();
        stt0[i]=stts[0];//这就是你想要得到的正向链表首指针数组
        stt1[i]=stts[1];//这就是你想要得到的反向链表首指针数组
    }

    printf("输入的所有链表为\n");
    for(i=0;i<size;i++)
    {
        sttHead->next0=stt0[i];
        printSTT(sttHead,0);
    }
    printf("所有反转链表为\n");
    for(i=0;i<size;i++)
    {
        sttHead->next1=stt1[i];
        printSTT(sttHead,1);
    }
    return 0;
}

STT **creatSTT()
{
    char num;
    STT *stt0=NULL,*sttTail=NULL,*sttNew=NULL,**stts;
    stts=(STT**)malloc(sizeof(STT *)*2);//存放首尾节点的指针数组
    printf("请连续输入一串数字组成链表:(非数字字符将被过滤)\n->");
    while(1)
    {
        num=getchar();
        if(num>='0' && num<='9')
        {
            sttNew=(STT *)malloc(sizeof(STT));
            sttNew->num=num;
            sttNew->next0=NULL;
            sttNew->next1=NULL;
            if(stt0==NULL)
                stt0=sttNew;
            else
            {
                sttTail->next0=sttNew;//连接正向链表指针
                sttNew->next1=sttTail;//连接反向链表指针
            }
            sttTail=sttNew;
        }
        if(num=='\n')
            break;
    }
    stts[0]=stt0;
    stts[1]=sttTail;
    return stts;
}
void printSTT(STT *sttHead,int flag)
{
    if(flag==0)
    {
        while(sttHead->next0)
        {
            printf("%c",sttHead->next0->num);
            sttHead=sttHead->next0;
        }
        printf("\n");
    }
    else
    {
        while(sttHead->next1)
        {
            printf("%c",sttHead->next1->num);
            sttHead=sttHead->next1;
        }
        printf("\n");
    }
}

追问

双向链表也可以,但是题目要求建立单链表,没办法😂

你说的第二点:我是想将地址保存到数组里,然后指针指向新的地址再保存到数组里,依次类推,但是我对指针重新复指后却覆盖了上一轮的输入

追答

双,单都是一个写法,无非我正反链表的连接都写在一个函数里,你把反向的单独拿出来写,不就是单链表反向了么。

追问

现在问题不在反向上,我估计可能是链表的建立那里有问题,我再检查检查,还有问题就麻烦大家了😂

追答

“我是想将地址保存到数组里,然后指针指向新的地址再保存到数组里”
我写的就是你想要的啊,你看stt0[]和stt1[]这两数组不就是你想要的么,链表首指针组成的数组。

追问

解决了

没有初始化它😂😂😂

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-05-24
删除指针而不释放内存的话,就会造成内存泄漏,就无法再使用到这部分内存了。
你的意思并不是删除指针,是对这个指针指向的变量重新赋值追问

可是重新赋值的话,那块内存值也会变化啊,也就是我输入n行数据,最后这样循环赋值,可结果也只是第n个数据

追答

那看你如何控制了,赋值给变量,当然内存数据会变化啊,只是变量的地址不变化。

第2个回答  2018-05-24
没明白你的需求,[删除指针]是什么意思?追问

我想将指针放入数组后,重新赋值,所以要"清空"一下指针,但不释放他所指的内存,不然就白弄了

最后的输出我想用数组数组输出,所以内存不能动,想在输入部分的每一遍循环最后,把指针删掉重新定义

追答

用代码举个例子吧,假设有个链表【a,b,c,d,e......】,这些a,b,c,d,e......都是Node *指针类型,头节点指针为h,你新建了一个数组Node arr[100],然后你想做什么?

追问

这是第一个链表,执行arr[i] = head

循环n次(n为我要输入的链表数)

我把第一个放入后,再输入第二个会发生将上一个内存覆盖的结果,也就是比如我输入了三行链表123,1234,12345,最后拿数组输出的时候是三行54321。。。

追答

看你的描述,问题应该是出在你创建链表的地方,你以为你创建了3个链表,其实这3个链表用的是同一个存储空间,也就是你只创建了1个链表,即使你不做反转,你这3个链表输出也都会是3行12345。

追问

感觉有道理,我再检查检查

谢谢啦,解决了,

没有初始化它

本回答被提问者采纳
相似回答