C语言 链表 指针问题

C语言链表指针问题我做了一个题,题目要求一次性输入n(自己输入)个链表,然后逐行输出该链表反转(如1234转为4321)。我用循环输入了几个链表,并用自己设的新的头节点指... C语言 链表 指针问题我做了一个题,题目要求一次性输入n(自己输入)个链表,然后逐行输出该链表反转(如1234转为4321)。我用循环输入了几个链表,并用自己设的新的头节点指向这个反转后的链表,然后将将这个新的头结点存入一个数组。但是输出结果却显示了n行我第n个链表的反转。于是我想实现将这个头结点存入数组后再清空他进入下一轮循环赋值,结果输出确实n行空。。。。。有没有什么办法删除指针但不释放他的内存? 展开
 我来答
自我编程
2018-05-24 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

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");
    }
}
更多追问追答
追问
双向链表也可以,但是题目要求建立单链表,没办法😂
你说的第二点:我是想将地址保存到数组里,然后指针指向新的地址再保存到数组里,依次类推,但是我对指针重新复指后却覆盖了上一轮的输入
KevinDears
2018-05-24 · TA获得超过4561个赞
知道大有可为答主
回答量:1万
采纳率:58%
帮助的人:1007万
展开全部
删除指针而不释放内存的话,就会造成内存泄漏,就无法再使用到这部分内存了。
你的意思并不是删除指针,是对这个指针指向的变量重新赋值
更多追问追答
追问
可是重新赋值的话,那块内存值也会变化啊,也就是我输入n行数据,最后这样循环赋值,可结果也只是第n个数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wenqing8585
2018-05-24 · TA获得超过8252个赞
知道大有可为答主
回答量:8078
采纳率:70%
帮助的人:3874万
展开全部
没明白你的需求,[删除指针]是什么意思?
更多追问追答
追问
我想将指针放入数组后,重新赋值,所以要"清空"一下指针,但不释放他所指的内存,不然就白弄了
最后的输出我想用数组数组输出,所以内存不能动,想在输入部分的每一遍循环最后,把指针删掉重新定义
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式