| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 872 人关注过本帖
标题:来一次网吧不容易小弟一次把问题问完啦呵呵
只看楼主 加入收藏
墨香555
Rank: 2
等 级:论坛游民
帖 子:115
专家分:31
注 册:2010-10-21
结帖率:96.15%
收藏
已结贴  问题点数:20 回复次数:13 
来一次网吧不容易小弟一次把问题问完啦呵呵
我在家自学数据结构 但遇到了些问题怎么想就想不通
这是队列的入队操作
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE,*LQNODE;
void create(LQNODE *front,LQNODE *rear)
{
    *front=(NODE *)malloc(sizeof(NODE));
    (*front)->next=NULL;
    *rear=*front;                    ( A )                              
}
void push(LQNODE *rear,int x)
{
    NODE *p;
    p=(NODE *)malloc(sizeof(NODE));
    p->data=x;
    p->next=NULL;                       (*rear)->next=p;
    *rear=p;
}
void print(LQNODE *front)
{
    NODE *p;
    p=(*front)->next;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->next;
    }
}
void main()
{
    LQNODE front,rear;
    int x=0,i;
    create(&front,&rear);
    printf("请输入5个元素:");
    for(i=0;i<5;i++)
    {
        scanf("%d",&x);
        push(&rear,x);

    }
    print(&front);
}
问题 1:我就想不明白为什么在 A处得代码 改为*front=*rear 程序就运行不成功呢
问题2:还有为什么队头指针front和队尾指针rear不能用NODE 定义呢?
我把他们改成用NODE 定义后的代码为:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE;
void create(NODE *front,NODE *rear)
{
    front=(NODE *)malloc(sizeof(NODE));
    front->next=NULL;
    rear=front;

}
void push(NODE *rear,int x)
{
    NODE *p;
    p=(NODE *)malloc(sizeof(NODE));
    p->data=x;
    p->next=NULL;            
    rear->next=p;
    rear=p;
}
void print(NODE *front)
{
    NODE *p;
    p=front->next;
    while(p!=NULL)
    {
        printf("%d",p->data);
        p=p->next;
    }
}
void main()
{
    NODE *front,*rear;
    rear=front=(NODE*)malloc(sizeof(NODE));
    int x,i;
    create(front,rear);
    printf("请输入5个元素:");
    for(i=0;i<5;i++)
    {
        scanf("%d",&x);
        push(rear,x);

    }
    print(front);
}
问题3:但为什么运行的结果却是:
请输入5个元素:6 5 4 3 2
2Press any key to continu
问题4:
还有个队列的出队问题请看以下代码
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE,*LQNODE;
void create(LQNODE *front,LQNODE *rear)
{
    *front=(NODE *)malloc(sizeof(NODE));
    (*front)->next=NULL;
    *rear=*front;
}
void push(LQNODE *rear,int x)
{
    NODE *p;
    p=(NODE*)malloc(sizeof(NODE));
    p->data=x;
    p->next=NULL;
    (*rear)->next=p;
    *rear=p;
}
void out(LQNODE *front,LQNODE *rear,int x)
{
    NODE *p;
    if(*front!=*rear)
    {
        p=(*front)->next;
        (*front)->next=p->next;/*注意出队方式若改成*front=p->next;free(p);则再次出队时将出错因为p=(*front)->next*/
        if(p->next==NULL)      /*注意出队一个元素后一定要判断队是否为空*/
            *rear=*front;
        x=p->data;
    free(p);
}
void print(LQNODE *front)
{
    NODE *p;
    p=(*front)->next;
    if(p!=NULL)
    {
        printf("output the linkqueue:");
        while(p!=NULL)
        {
            printf("%d",p->data);
            p=p->next;
        }
    }
    else
    {
        printf("为空队列");
    }
}
void main()
{
    LQNODE front,rear;
    int i,x,y;
    create(&front,&rear);
    print(&front);
    printf("元素:");
    for(i=0;i<5;i++)
    {
        scanf("%d",&x);
        push(&rear,x);
    }
    print(&front);
    out(&front,&rear,y);
    printf("%d",y);
    print(&front);
}
这个出队的代码提示出错:
:\Documents and Settings\Administrator\tyj.cpp(36) : error C2601: 'print' : local function definitions are illegal
C:\Documents and Settings\Administrator\tyj.cpp(54) : error C2601: 'main' : local function definitions are illegal
C:\Documents and Settings\Administrator\tyj.cpp(70) : fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

tyj.exe - 1 error(s), 0 warning(s)
搜索更多相关主题的帖子: next void include create 网吧 
2011-07-26 18:46
VC__fejq
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-7-26
收藏
得分:0 
不懂 还是回下贴!
2011-07-26 19:30
xiangqiu1986
Rank: 2
等 级:论坛游民
帖 子:79
专家分:95
注 册:2011-5-5
收藏
得分:0 
,貌似很难!

学无止境!
2011-07-26 19:59
qijun4588
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2011-7-27
收藏
得分:5 
A处*rear没有任何指向,只能被赋值或分配内存。可以用NODE定义rear和front,操作的时候得用&NODE
后面的没时间看了,要上班,楼主要想学好c的话得自己学着调试,turbo c不好用,直接用vc吧,它的调试工具很强大的,找问题就直接单步走,监视变量就行了

收到的鲜花
  • 以中2011-07-27 22:42 送鲜花  -2朵   附言:我不是很赞同,你有分散精力的嫌疑,编译环 ...
2011-07-27 09:49
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:5 
NODE                LQNODE                LQNODE*
一个普通节点        一个指向NODE的指针    一个指向LQNODE的指针(也就是二级指针,一个指向指针的指针)
前3个问题就是涉及用二级指针修改一个一级指针指向问题。

你在主函数中定义LQNODE front,rear,这说明front和rear是指向NODE的指针。既然用函数create修改front和rear指针指向,而不是直接在主函数修改,就要考虑将变量front和rear他们自身的地址(&front &rear)传递过去,所以在函数creat那里用的形参是LQNODE *front,LQNODE *rear,其实就是NODE **front,NODE **rear.这样函数creat中都用*front和*rear进行处理。如果写成rear=front,那是修改函数creat里面的变量rear的指向,不会改变主函数rear的指向(可以自己画个图,模拟下)。


帮人《---》帮己
2011-07-27 10:48
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
    int data;
    struct node *next;
}NODE,*LQNODE;
void create(LQNODE *front,LQNODE *rear)
{
    *front=(NODE *)malloc(sizeof(NODE));
    (*front)->next=NULL;
    *rear=*front;
}
void push(LQNODE *rear,int x)
{
    NODE *p;
    p=(NODE*)malloc(sizeof(NODE));
    p->data=x;
    p->next=NULL;
    (*rear)->next=p;
    *rear=p;
}
void out(LQNODE *front,LQNODE *rear,int *x)//取x值,应该是指针,或者通过return返回
{
    NODE *p;
    if(*front!=*rear)
    {
        p=(*front)->next;
        (*front)->next=p->next;/*注意出队方式若改成*front=p->next;free(p);则再次出队时将出错因为p=(*front)->next*/
        if(p->next==NULL)      /*注意出队一个元素后一定要判断队是否为空*/
            *rear=*front;
        *x=p->data;
    }//缺少括号
    free(p);
}
void print(LQNODE *front)
{
    NODE *p;
    p=(*front)->next;
    if(p!=NULL)
    {
        printf("output the linkqueue:");
        while(p!=NULL)
        {
            printf("%d ",p->data);//增加空格,方便观察
            p=p->next;
        }
        printf("\n");//增加换行
    }
    else
    {
        printf("为空队列");
    }
}
void main()
{
    LQNODE front,rear;
    int i,x,y;
    create(&front,&rear);
    print(&front);
    printf("元素:");
    for(i=0;i<5;i++)
    {
        scanf("%d",&x);
        push(&rear,x);
    }
    print(&front);
    out(&front,&rear,&y);
    printf("%d\n",y);//增加\n
    print(&front);
}
第四个问题,原因在注释中标注



帮人《---》帮己
2011-07-27 10:57
王者自谦1992
Rank: 2
等 级:论坛游民
帖 子:57
专家分:74
注 册:2011-4-6
收藏
得分:0 
好长好长的程序....看不下去了
2011-07-27 11:04
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
回复 7楼 王者自谦1992
几段很小的程序,继续看吧,多看,比这长的代码还有很多。

我们都在路上。。。。。
2011-07-27 11:20
platolgq
Rank: 2
来 自:江西
等 级:论坛游民
帖 子:74
专家分:87
注 册:2011-2-24
收藏
得分:0 
数据结构看了看,但是不知道怎么去学好!!!

C种的自学者
2011-07-27 12:22
墨香555
Rank: 2
等 级:论坛游民
帖 子:115
专家分:31
注 册:2010-10-21
收藏
得分:0 
回复 4楼 qijun4588
谢谢你的答案 原来我把问题想复杂啦 呵呵
2011-07-27 18:29
快速回复:来一次网吧不容易小弟一次把问题问完啦呵呵
数据加载中...
 
   



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

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