注册 登录
编程论坛 C语言论坛

给renkejun1942 烟雨晨曦 送分

wp231957 发布于 2017-03-22 16:22, 1243 次点击
我想大约我明白了  链表的逆序是怎么回事了

只有本站会员才能查看附件,请 登录


就是这个NEXT指针的依次后移  绕的迷糊  好迷糊啊  不像两个数据交换 t=a a=b b=t 那么简单
15 回复
#2
烟雨晨曦2017-03-22 20:36
理解了就很简单
#3
renkejun19422017-03-23 09:36
是啊,逆序就是Next不断后移到链表尾,然后在后移的过程中,修改结构中Next指针的值。

操作链表一定要掌握一个很重要的东西,那就是不要去追踪链表的执行过程,只需要保证起始正确,以及有正确的结束条件,就跟递归差不多。

你不会去尝试追踪递归的执行过程吧?只需要保证每一次执行都接近结束条件就可以了。



[此贴子已经被作者于2017-3-23 09:41编辑过]

#4
wp2319572017-03-23 20:41
回复 3楼 renkejun1942
我还真尝试过去追递归  后来放弃了
#5
wp2319572017-03-23 20:45
我手头有一本(仅有的一本) c方面书  在介绍双链表时  是这样说的,限于篇幅关系  插入删除啥的 就不一一举例了

请读者自行推演,如果你有双链表方面的代码  还请帖一些   我对于双链表的 前指针 比较迷糊

普通指针可以用p++来后移  用p--来前移  这个链表就没那么方便了
#6
renkejun19422017-03-23 20:58
回复 5楼 wp231957
可以哦,但是双链表,我没实现搜索,因为双链表,可以从多个地点开始,可以倒序,可以逆序,搜索是个坑。
我还没想到怎么处理。

[此贴子已经被作者于2017-3-23 21:19编辑过]

#7
renkejun19422017-03-23 21:06
回复 5楼 wp231957
对了,帮我把我那个零件管理的帖子删掉怎么样,那个程序的输入部分还有很多的BUG。
#8
wp2319572017-03-23 21:31
回复 7楼 renkejun1942
已删除
ps  我也可以回复 网友 关于链表的帖子了  
如果无聊 有功夫 帮我看看 我的代码 是否有需要改进的地方https://bbs.bccn.net/thread-475138-2-1.html
#9
renkejun19422017-03-23 21:58
回复 8楼 wp231957
程序代码:
#include <stdio.h>
#include <malloc.h>

#define N 9

typedef struct data
{
    int value;
    struct data* next;
}tdata,*pdata;


void prnlist(pdata head)
{
    pdata pfirst=head->next;
    while(pfirst!=NULL)
    {
        printf("%d  ",pfirst->value);
        pfirst=pfirst->next;
    }
    printf("\n");
}


int main(int argc, char* argv[])
{
    pdata  head1,pfirst1,psecond1;
    pfirst1=(pdata)malloc(sizeof(tdata));//第一个链表哑节点
    head1=pfirst1;
    head1->value=0;
    head1->next=NULL;
    psecond1=pfirst1;
    int i;
    printf("请录入第一组数据 :\n");
    for(i=0;i<N;i++)
    {
        pfirst1=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst1->value);
        pfirst1->next=NULL;
        psecond1->next=pfirst1;
        psecond1=pfirst1;//我弄错了,Psecond1指向pfirst1是为了更新指针,让其前移。
    }
    printf("请录入第二组数据:\n");
    pdata pfirst2=(pdata)malloc(sizeof(tdata));//第二个链表哑节点
    pdata head2=pfirst2;
    head2->value=0;
    head2->next=NULL;
    pdata psecond2=pfirst2;
    for(i=0;i<N;i++)
    {
        pfirst2=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst2->value);
        pfirst2->next=NULL;
        psecond2->next=pfirst2;
        psecond2=pfirst2;//我弄错了,Psecond1指向pfirst1是为了更新指针,让其前移。
            
    }
    printf("你所录入的两组数据如下:\n");
    prnlist(head1);
    prnlist(head2);
    printf("共有数据如下:\n");
    for(pfirst1=head1->next;pfirst1!=NULL;pfirst1=pfirst1->next)//遍历链表1
    {
        for(pfirst2=head2->next;pfirst2!=NULL;pfirst2=pfirst2->next)//遍历链表2
        {
            if(pfirst2->value==pfirst1->value) printf("%d  ",pfirst2->value);//如果链表2中有链表1的值,则打印该值。
        }
    }
    printf("\n");
    free(head1);//释放错了,你只释放了哑节点的空间,但没有释放之后节点的空间。
    free(head2);//要释放链表的空间,需要遍历链表,一个指针不断前移,然后一边释放,这里会需要一个指针指向下一个节点。否则将无法遍历链表
    return 0;
}


[此贴子已经被作者于2017-3-23 22:14编辑过]

#10
wp2319572017-03-23 22:01
回复 9楼 renkejun1942
谢谢  我再看看

那个链表释放那么麻烦  干脆就不释放了  反正现在的电脑又不差那点内存
#11
renkejun19422017-03-23 22:02
回复 10楼 wp231957
释放内存的目的是为了那些需要长时间运行的程序,如果程序只运行一次,的确没必要释放内存。
可能你没注意,我写的好多程序都没释放内存,反正就运行一次,退出,内存就自动被系统回收了。

[此贴子已经被作者于2017-3-23 22:04编辑过]

#12
wp2319572017-03-23 22:06
回复 9楼 renkejun1942
程序代码:
#include <stdio.h>
#include <malloc.h>

#define N 9

typedef struct data
{
    int value;
    struct data* next;
}tdata,*pdata;


void prnlist(pdata head)
{
    pdata pfirst=head->next;
    while(pfirst!=NULL)
    {
        printf("%d  ",pfirst->value);
        pfirst=pfirst->next;
    }
    printf("\n");
}


int main(int argc, char* argv[])
{
    pdata  head1,pfirst1,psecond1;
    pfirst1=(pdata)malloc(sizeof(tdata));
    head1=pfirst1;
    head1->value=0;
    head1->next=NULL;
    psecond1=pfirst1;
    int i;
    printf("请录入第一组数据 :\n");
    for(i=0;i<N;i++)
    {
        pfirst1=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst1->value);
        pfirst1->next=NULL;
        psecond1->next=pfirst1;
        //psecond1=pfirst1;
    }
    printf("请录入第二组数据:\n");
    pdata pfirst2=(pdata)malloc(sizeof(tdata));
    pdata head2=pfirst2;
    head2->value=0;
    head2->next=NULL;
    pdata psecond2=pfirst2;
    for(i=0;i<N;i++)
    {
        pfirst2=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst2->value);
        pfirst2->next=NULL;
        psecond2->next=pfirst2;
        //psecond2=pfirst2;
    }
    printf("你所录入的两组数据如下:\n");
    prnlist(head1);
    prnlist(head2);
    printf("共有数据如下:\n");
    for(pfirst1=head1->next;pfirst1!=NULL;pfirst1=pfirst1->next)
    {
        for(pfirst2=head2->next;pfirst2!=NULL;pfirst2=pfirst2->next)
        {
            if(pfirst2->value==pfirst1->value) printf("%d  ",pfirst2->value);
        }
    }
    printf("\n");
    //free(head1);
   
//free(head2);
    return 0;
}

可是这样改  就完蛋了 没链了
#13
renkejun19422017-03-23 22:13
回复 12楼 wp231957
我重新看了一次,是我弄错了,原来psecond1指向pfirst1,为了更新指针。

好吧,重新看了一番,很仔细的,你的代码就只有释放内存不对。



[此贴子已经被作者于2017-3-23 22:15编辑过]

#14
wp2319572017-03-23 22:19
回复 13楼 renkejun1942
你远比我有耐心  再次表示感谢
#15
renkejun19422017-03-23 22:22
回复 14楼 wp231957
多手帮你重新编辑了一下,你看看这样会不会更好一些。

将同用途的变量放在同一组神明中。

所以指针根据用途,会有三组。
一组,头指针,一组临时指针,一组遍历链表用的指针。

程序代码:
#include <stdio.h>
#include <malloc.h>

#define N 9

typedef struct data
{
    int value;
    struct data* next;
}tdata,*pdata;


void prnlist(pdata head)
{
    pdata pfirst=head->next;
    while(pfirst!=NULL)
    {
        printf("%d  ",pfirst->value);
        pfirst=pfirst->next;
    }
    printf("\n");
}


int main(int argc, char* argv[])
{
    pdata pfirst1, pfirst2;
    pdata head1, head2;
    pdata psecond1, psecond2;
    int i;

    pfirst1=(pdata)malloc(sizeof(tdata));//第一个链表哑节点
    head1=pfirst1;
    head1->value=0;
    head1->next=NULL;
    psecond1 = pfirst1;
   
    printf("请录入第一组数据 :\n");
    for(i=0;i<N;i++)
    {
        pfirst1=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst1->value);
        pfirst1->next=NULL;
        psecond1->next=pfirst1;
        psecond1=pfirst1;
    }


    pfirst2=(pdata)malloc(sizeof(tdata));//第二个链表哑节点
    head2=pfirst2;
    head2->value=0;
    head2->next=NULL;
    psecond2 = pfirst2;

    printf("请录入第二组数据:\n");
    for(i=0;i<N;i++)
    {
        pfirst2=(pdata)malloc(sizeof(tdata));
        scanf("%d",&pfirst2->value);
        pfirst2->next=NULL;
        psecond2->next=pfirst2;
        psecond2=pfirst2;
            
    }
    printf("你所录入的两组数据如下:\n");
    prnlist(head1);
    prnlist(head2);

    printf("共有数据如下:\n");
    for(pfirst1=head1->next;pfirst1!=NULL;pfirst1=pfirst1->next)
    {
        for(pfirst2=head2->next;pfirst2!=NULL;pfirst2=pfirst2->next)
        {
            if(pfirst2->value==pfirst1->value) printf("%d  ",pfirst2->value);
        }
    }
    printf("\n");
    return 0;
}


[此贴子已经被作者于2017-3-23 22:28编辑过]

#16
Emotiona2017-03-25 22:23
回复 5楼 wp231957
老坛的书
1