标题:关于链表插入的操作 大家帮看看 是否存在什么bug一类的
只看楼主
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
结帖率:99.76%
已结贴  问题点数:100 回复次数:7 
关于链表插入的操作 大家帮看看 是否存在什么bug一类的
程序代码:
// tlink.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <malloc.h>

typedef struct date
{
    unsigned int month;
    unsigned int day;
    unsigned int year;
    struct date* next;
}tdate,*pdate;

//链表插入函数
//为了方便操作 把head指针传入 实际上没有参与计算
//inspos 为中间插入时的索引 其他插入方式无效
//beginp 为插入数据块的首地址
//flag为插入标志 0 尾部插入 1 头部插入  2 中间插入
//endp就是所谓的后驱指针 我理解为临时变量
pdate linkins(pdate head,pdate beginp,pdate endp,unsigned int flag,unsigned inspos)
{
    pdate tmp=NULL;
    if(flag==0) 
    {
        beginp->next=NULL;
        endp->next=beginp;
        endp=beginp;
    }
    if(flag==1) 
    {
        endp=head;
        tmp=head->next;
        endp->next=beginp;
        endp=beginp;
        beginp->next=tmp;
    }
    if(flag==2) 
    {
        pdate tp;
        tp=head->next;
        int n=1;
        while(tp!=NULL)
        {
            tp=tp->next;
            n++;
            if(n==inspos)
            {
                endp=tp;
                tmp=tp->next;
                break;
            }
        }
        endp->next=beginp;
        endp=beginp;
        beginp->next=tmp;
    }
    return head;
}

int main(int argc, char* argv[])
{
    pdate  head;
    pdate  beginp;
    pdate  endp;
    pdate  tmp;
    //链表正常创建
    beginp=(pdate)malloc(sizeof(tdate));
    head=beginp;
    endp=beginp;
    int i;
    for(i=0;i<3;i++)
    {
        beginp=(pdate)malloc(sizeof(tdate));
        scanf("%u%u%u",&beginp->month,&beginp->day,&beginp->year);
        beginp->next=NULL;
        endp->next=beginp;
        endp=beginp;
    }
    printf("////////////正常输出示例//////////////////\n");
    beginp=head->next;
    while(beginp!=NULL)
    {
        printf("%6u%4u%4u\n",beginp->year,beginp->month,beginp->day);
        beginp=beginp->next;
    }
    //在链表尾部插入示例:
    beginp=(pdate)malloc(sizeof(tdate));
    scanf("%u%u%u",&beginp->month,&beginp->day,&beginp->year);
    head=linkins(head,beginp,endp,0,0);
    printf("////////////在尾部插入后输出示例//////////////////\n");
    beginp=head->next;
    while(beginp!=NULL)
    {
        printf("%6u%4u%4u\n",beginp->year,beginp->month,beginp->day);
        beginp=beginp->next;
    }
    //在链表头部插入示例:
    beginp=(pdate)malloc(sizeof(tdate));
    scanf("%u%u%u",&beginp->month,&beginp->day,&beginp->year);
    head=linkins(head,beginp,endp,1,0);
    printf("////////////在头部插入后输出示例//////////////////\n");
    beginp=head->next;
    while(beginp!=NULL)
    {
        printf("%6u%4u%4u\n",beginp->year,beginp->month,beginp->day);
        beginp=beginp->next;
    }
    //在链表中间插入示例:
    beginp=(pdate)malloc(sizeof(tdate));
    scanf("%u%u%u",&beginp->month,&beginp->day,&beginp->year);
    head=linkins(head,beginp,endp,2,2);
    printf("////////////在链表中间插入后输出示例//////////////////\n");
    beginp=head->next;
    while(beginp!=NULL)
    {
        printf("%6u%4u%4u\n",beginp->year,beginp->month,beginp->day);
        beginp=beginp->next;
    }
    ///////////////////////////////////////////////////
    free(head);
    return 0;
}

/*  示例效果
1 1 1
2 2 2
3 3 3
////////////正常输出示例//////////////////
     1   1   1
     2   2   2
     3   3   3
4 4 4
////////////在尾部插入后输出示例//////////////////
     1   1   1
     2   2   2
     3   3   3
     4   4   4
0 0 0
////////////在头部插入后输出示例//////////////////
     0   0   0
     1   1   1
     2   2   2
     3   3   3
     4   4   4
9 9 9
////////////在链表中间插入后输出示例//////////////
     0   0   0
     1   1   1
     9   9   9
     2   2   2
     3   3   3
     4   4   4
*/
搜索更多相关主题的帖子: 控制台 应用程序 
2017-03-17 08:50
Alien_Lee
Rank: 8Rank: 8
来 自:Linux帝国
等 级:蝙蝠侠
威 望:7
帖 子:149
专家分:739
注 册:2016-7-19
得分:25 
1.内存分配有可能不成功的情况,这个没有处理。
2.其实你定义有tmp这个指针,就不要让beginp来作为你的中间指针,最后你的tmp指针还没有用上。而且beginp和endp如果没有想错的话,你应该是想它始终指示开头和结尾,否则没有意义,但是你程序中间并没有这个意思。
3.inspos意思上是表示要插入到第几个吧,我理解这个意思,而不是什么索引。
总的来说,程序能运行,说明逻辑问题肯定没有,但是你各个指针表示的意思并不是十分明确(beginp和endp)。

  DEBUG的过程就是进步的过程,每一个小错误都是大问题!...
2017-03-17 11:22
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
回复 2楼 Alien_Lee
我现在对这些指针还是很迷糊呢
一楼的代码是我硬调试出来的,首尾插入还好一些  中间插入时 链条一度中断  好不容易才连上

下面准备研究一下 逆序和排序  看看能不能对这些指针再深一步了解

DO IT YOURSELF !
2017-03-17 13:03
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:25 
注释好像有点不对。从代码来看endp是新节点入表之后的前驱。所谓头节点插入其实上是插在head之后。head实际上成为头哨兵了。
2017-03-17 13:55
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
得分:25 
感觉你逻辑好混乱,多画流程图,照着图来写程序。
2017-03-17 20:51
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
画啥流程图啊。我这些指针头疼
下午,看那个链表逆序  代码就几行。硬是看不懂

DO IT YOURSELF !
2017-03-17 22:35
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:25 
回复 6楼 wp231957
找  老师  同学  讨论下 尝试
2017-03-17 23:06
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
以下是引用寒风中的细雨在2017-3-17 23:06:24的发言:

找  老师  同学  讨论下 尝试

我不做学生好多年。找誰去

DO IT YOURSELF !
2017-03-18 00:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-475171-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.223067 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved