免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2513 | 回复: 9

[C] C语言语法的一些疑惑 [复制链接]

论坛徽章:
0
发表于 2009-11-25 20:32 |显示全部楼层
10可用积分
我读清华大学出版社的《数据结构(c语言版)》,读数组部分产生了一些疑惑,希望各位能帮助解答,不胜感激。

#include "stdafx.h"
#include "stdlib.h"

typedef int ElemType;
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior;
    struct DuLNode *next;
}DuLNode,*DuLinkList;

void CreatDuList(DuLinkList &head)
{
    DuLinkList tail,p;
    int n,i;
    p =(DuLNode *)malloc(sizeof(DuLNode));
    head=tail=p;
    head->next=NULL;
    head->prior=NULL;
    printf("input the length of the DuLinkList:n");
    scanf("%d",&n);
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<n;i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = (DuLNode *)malloc(sizeof(DuLNode));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf("input valude:n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  scanf("%d",&p->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  p->next=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail->next=p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->prior=tail;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail=p;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;tail->next=head;
&nbsp;&nbsp;&nbsp;&nbsp;head->prior=tail;
}

void PrintDuList(DuLinkList &head){
&nbsp;&nbsp;&nbsp;&nbsp;DuLinkList tail=head->next;
&nbsp;&nbsp;&nbsp;&nbsp;while(tail!=head){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%dn",tail->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail=tail->next;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
int _tmain(int argc, _TCHAR* argv[]){
&nbsp;&nbsp;&nbsp;&nbsp;DuLinkList DLa;
&nbsp;&nbsp;&nbsp;&nbsp;CreatDuList(DLa);
&nbsp;&nbsp;&nbsp;&nbsp;printf("print the DLan");
&nbsp;&nbsp;&nbsp;&nbsprintDuList(DLa);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

上面是一段创建并打印双向链表的程序,我是根据书上的讲解写的(书上实现的单向链表,我改动了点变成双向)。在vs2008 c++中运行成功,但是我有一些疑惑。
void CreatDuList(DuLinkList &head)
这一句中DuLinkList本身已经代表是指针了为什么还要在head前加&?
这样不就变为struct DuLNode *(&head)了么?
这句话用我学的c语言的知识解释不通,我也翻阅了《the c programming language》其中没有这样的用法。
这段代码经过一些细微调整后(主要是main()函数的名字和参数)在gcc下编译,提示语法错误。
位置就是CreatDuList(DuLinkList &head)。
但是程序在g++中调试成功。
至此我怀疑我看的数据结构c语言版,这一段代码是不是c++版啊?因为同样的代码gcc不可以,但是vs2008(c++)
和g++都可以。
所以我更改函数
CreatDuList(DuLinkList &head) 为CreatDuList(DuLNode *head)
PrintDuList(DuLinkList &head)为PrintDuList(DuLNode *head)
这时在gcc下调试通过,
然后运行程序,输入链表的时候很正常,但是打印出来的是一个int类型的数字,不对了。

这段程序在vs2008中执行的时候,编译正常,但是输入链表的时候出错
CreatDuList(DLa);这一句说,DLa为赋值。

我想知道
1、        怎样改动才能在gcc下正常运行。
2、typedef struct DuLNode{
        …
}DuLNode,*DuLinkList;
void CreatDuList(DuLinkList &head)
这种用法是c语法么?如果是的话该怎么理解。

最佳答案

查看完整内容

你是对C的指针理解的不透彻,所以才会有这两个问题。指针也是一个值,只不过它的值,是一个地址,地址指向了元素。比如,int p = 10; int *pp = &p; 就是说,pp是一个指针,它指向了p的地址。但是呢,如果你想在一个函数中给指针赋值,就必须把指针的地址给传进去了。比如,int f (int **ppp) { *ppp = pp; },这样,对指针的地址赋值,就成功了。所以, 链表的初使化操作,由于是要给指针赋值,所以必须把指针的地址传进去。而另 ...

论坛徽章:
0
发表于 2009-11-25 20:32 |显示全部楼层
你是对C的指针理解的不透彻,所以才会有这两个问题。

指针也是一个值,只不过它的值,是一个地址,地址指向了元素。
比如,int p = 10; int *pp = &p; 就是说,pp是一个指针,它指向了p的地址。

但是呢,如果你想在一个函数中给指针赋值,就必须把指针的地址给传进去了。
比如,int f (int **ppp) { *ppp = pp; },这样,对指针的地址赋值,就成功了。
所以, 链表的初使化操作,由于是要给指针赋值,所以必须把指针的地址传进去。

而另一个问题,void CreatDuList(DuLinkList &head), 并不是C的语法。而是C++的,表示这里传入的是head引用。引用也是传了实际值,没有烤备,但是不能修改。

好好看看书吧!

论坛徽章:
0
发表于 2009-11-25 20:55 |显示全部楼层
不是,这本书的前面已经说了,不是完全按照C的语法来的,间或有一些C++的或者伪码在里面

论坛徽章:
0
发表于 2009-11-25 20:59 |显示全部楼层
清华大学出版社的《数据结构(c语言版)》
我大学老师是白痴,吹嘘这个教材好,那Y连C代码都不会写,整天就知道吹pascal,吹delphi,其实他也不会用。

论坛徽章:
0
发表于 2009-11-25 21:28 |显示全部楼层
原帖由 prolj 于 2009-11-25 20:59 发表
清华大学出版社的《数据结构(c语言版)》
我大学老师是白痴,吹嘘这个教材好,那Y连C代码都不会写,整天就知道吹pascal,吹delphi,其实他也不会用。

shakehands,跟我们老师一样

论坛徽章:
0
发表于 2009-11-25 21:32 |显示全部楼层

回复 #4 naihe2010 的帖子

谢谢啦,您说的非常清楚
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
typedef struct DuLNode{
&nbsp;&nbsp;&nbsp;&nbsp;ElemType data;
&nbsp;&nbsp;&nbsp;&nbsp;struct DuLNode *prior;
&nbsp;&nbsp;&nbsp;&nbsp;struct DuLNode *next;
}DuLNode,*DuLinkList;

void CreatDuList(DuLinkList *head){
&nbsp;&nbsp;&nbsp;&nbsp;DuLinkList tail,p;
&nbsp;&nbsp;&nbsp;&nbsp;int n,i;
&nbsp;&nbsp;&nbsp;&nbsp;p =(DuLNode *)malloc(sizeof(DuLNode));
&nbsp;&nbsp;&nbsp;&nbsp;(*head)=tail=p;
&nbsp;&nbsp;&nbsp;&nbsp;(*head)->next=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;(*head)->prior=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;printf("input the length of the DuLinkList:n");
&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&n);
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i<n;i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p = (DuLNode *)malloc(sizeof(DuLNode));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  printf("input valude:n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  scanf("%d",&p->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  p->next=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail->next=p;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p->prior=tail;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail=p;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;tail->next=*head;
&nbsp;&nbsp;&nbsp;&nbsp;(*head)->prior=tail;
}

void PrintDuList(DuLinkList *head){
&nbsp;&nbsp;&nbsp;&nbsp;DuLinkList tail=(*head)->next;
&nbsp;&nbsp;&nbsp;&nbsp;while(tail!=(*head)){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%dn",tail->data);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail=tail->next;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
int main(){
&nbsp;&nbsp;&nbsp;&nbsp;DuLinkList DLa=NULL;
&nbsp;&nbsp;&nbsp;&nbsp;CreatDuList(&DLa);
&nbsp;&nbsp;&nbsp;&nbsp;printf("print the DLan");
&nbsp;&nbsp;&nbsp;&nbsprintDuList(&DLa);
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

这样修改gcc就可以通过了,我也能理解,就是不知道有没有精简点的实现。
关于c++的那种引用传值,我也试了下子,确实是很方便。
谢谢各位的悉心指导

[ 本帖最后由 lovxj 于 2009-11-25 21:37 编辑 ]

论坛徽章:
0
发表于 2009-11-25 21:55 |显示全部楼层
原帖由 scutan 于 2009-11-25 20:55 发表
不是,这本书的前面已经说了,不是完全按照C的语法来的,间或有一些C++的或者伪码在里面

果然,前言里面有一句,添加了c++语言的引用条用参数传递方式。。。

论坛徽章:
0
发表于 2009-11-28 12:46 |显示全部楼层
原帖由 lovxj 于 2009-11-25 21:55 发表

果然,前言里面有一句,添加了c++语言的引用条用参数传递方式。。。

不知道为什么非得用点C++的东西
其实也就其实也就多一行代码而已

好的,现在,来改写书47页那个Status InitStack(Sqstack &S)函数
可以改为Status InitStack(SqStack *_S){
             SqStack S = *_S;
             ……
       }
那么,如何调用呢?如下,
SqStack S;
InitStack(&S);                &是取地址符
这样的话,在InitStack函数中对S的操作就是直接对主函数中的S进行的了

论坛徽章:
0
发表于 2009-11-29 23:11 |显示全部楼层
在看数据结构的视频, 看的云里雾里的, 边看边在vim上记录它的代码才理解了一点, 用C实现还没做, 网上下了个全C实现的代码!


共享看看!

8F《数据结构》的全部代码实现(C语言).rar

230.88 KB, 下载次数: 22

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP