一个关于typedef struct和struct的结构体问题!!!

TrustTJM 2012-11-12 08:01:29
比如说一个链表,

结构体一
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LN, *LinkedList;


结构体二
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkedList;

问题一:如果说typedef struct LNode{}L;的话,我是知道L是struct LNode的一个别名,在使用时直接L l;就行了,可是像上面一样,都是LNode是什么个意思呢?
问题二:然后就是*LinkedList,不解。。。。
//初始化单链表
LinkedList LinkedListInit()
{
LinkedList L;
L = (LinkedList) malloc (sizeof (LNode));
L->next = NULL;
return L;
}

问题三:LinkedList L;(L是指针类型吧,是不是上面定义结构体的时候这样*LinkedList,然后就可以直接这样定义,如果针对结构体一来说,如果定义一个链域是不是要LN *L才行呢?)
问题四:L = (LinkedList) malloc (sizeof (LNode));这段语句是为了初始化一个链域吧,对(LinkedList)是否可以用(LN *)来代替,对结构体一来说?
问题五:和问题一差不多,sizeof (LNode)里的LNode是哪个一个呢?

最后就是另结构体问题,比如说一个简单的结构体
struct f
{
int n
};

如果在main函数中需要定义一个结构体数组,但是元素个数不定,即struct f F[n],然后n用scanf输入,请问怎么实现呢?
...全文
355 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbq199204 2012-11-14
  • 打赏
  • 举报
回复
引用 16 楼 luckytjm 的回复:
引用 4 楼 lbq199204 的回复:问题一:不太明白你的意思, 问题二:*LinkedList,先举个例子吧,例如 int * p,那p 就是int *类型的。那接下来LinkedList就是struct LNode *的别名。(不知道这样说,你有没有看懂!) 问题三:是的,是指针类型(可参照问题二的解答。),另外你的(如果针对结构体一来说,如果定义一个链域是……
伤心咯,要结贴的时候才想到我,问题三,可以,问题一和五,大家都给你解答了,所以我就不废话了。至于你说的用malloc那个,我在这里写个给你。是用链表实现的,严格来说不是数组。我再翻翻书,找到,再回来补个更满意的回答你。

int n;
printf("您要输入几个数据:n=");
scanf("%d",&n);
LinkedList head = null;
LinkedList q = null;
LinkedList p = null;
p = head;
for (i=0; i<n; i++){
	q = (LinkedList )malloc(sizeof(LN));
	if (q==null){
		printf("分配空间失败!");
		exit -1;
	}
	else{
		q->next = null;
		p->next = q;
		p = q;
	}
}
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
结贴了,谢谢各位的帮助,我会认真给分的
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
引用 17 楼 generalhking 的回复:
引用 15 楼 luckytjm 的回复:引用 3 楼 generalhking 的回复:C/C++ code?12345typedef struct LNode{...}LN, *LinkedList;可以拆分成:typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。ty……
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
引用 10 楼 suwei2002 的回复:
引用 3 楼 generalhking 的回复:C/C++ code12345typedef struct LNode{...}LN, *LinkedList;可以拆分成:typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。typedef struct LNode{...……
这位仁兄很给力,赞一个
HAN-Kai 2012-11-13
  • 打赏
  • 举报
回复
引用 15 楼 luckytjm 的回复:
引用 3 楼 generalhking 的回复:C/C++ code?12345typedef struct LNode{...}LN, *LinkedList;可以拆分成:typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。typedef struct LNode{..……
哦,不好意思,没注意看了。 这是关于sizeof的,因为sizeof(参数),这里的参数一般来说最常用的是类型标识符,也可以是数组名,指针,对象等等。这里的参数应该是LNode类型,但无论是类型还是struct名字,其结果都是一样的。都表示LNode的结构体的大小。这个地方应该不用深究,呵呵,为了方便起见,最好还是不要把struct名和其定义的类型名用同一个名字。
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
引用 4 楼 lbq199204 的回复:
问题一:不太明白你的意思, 问题二:*LinkedList,先举个例子吧,例如 int * p,那p 就是int *类型的。那接下来LinkedList就是struct LNode *的别名。(不知道这样说,你有没有看懂!) 问题三:是的,是指针类型(可参照问题二的解答。),另外你的(如果针对结构体一来说,如果定义一个链域是不是要LN *L才行呢?)我不知道你要表达……
这位仁兄,我的问题三的意思是:LN *L是否等价于LinkedList L呢? 至于问题一和问题五,针对这个结构体
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LNode, *LinkedList;
因为LNode重复了,是否会出现异常情况呢? 然后是最后一个,我也曾想到是malloc,可是不知道怎么写。。。。。
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
引用 3 楼 generalhking 的回复:
C/C++ code?12345typedef struct LNode{...}LN, *LinkedList;可以拆分成:typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。typedef struct LNode{...}*LinkedList;//=>typede……
这位仁兄,您回答很简洁,还有最后一个问题哦,可以看看哈
TrustTJM 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 armsword 的回复:
问题一,你理解没问题,是的。 问题二,其实质应该是定义了新类型,你可以认为把struct LNode * 命名为 LinkedList。 问题三,没太明白你什么意思。 问题四,可以。 问题五, sizeof()里面应该是类型名,紧跟struct后面那个是标签,所以应该是大括号后面的LNode. 最后一个,使用 ->
这位朋友,问题一我最后还有个
可是像上面一样,都是LNode是什么个意思呢?
您没回答耶。。您说的“是的”是什么呢? 然后问题三:
LinkedList L;(L是指针类型吧,是不是上面定义结构体的时候这样*LinkedList,然后就可以直接这样定义,如果针对结构体一来说,如果定义一个链域是不是要LN *L才行呢?)
我的意思是针对这个结构体
typedef struct LNode
{
    ElemType data;
    struct LNode *next;
} LN, *LinkedList;
LN *L是否等价于LinkedList L呢?
14号选手 2012-11-12
  • 打赏
  • 举报
回复
问题一:你的理解是没有问题,struct LNode .....*LinkedList;中Linkedlist相当于给struct LNode .....*去了一个别名,就是指针类型 问题二:如上 问题三:根据上面的问题,你要知道Linkedlist用来定义就是一个指针变量了 问题四:malloc是为了动态的申请内存分配空间,因为如果是静态的话,可能会造成指针不当的操作造成崩溃,当然静态定义也行,但是一种歌链表你也不知道他有多少个节点,所以可能会造成空间浪费 问题五:可以
yuxi201261 2012-11-12
  • 打赏
  • 举报
回复
typedef 直接定义一种新类型,Lnode是typedef之后的
转角天边 2012-11-12
  • 打赏
  • 举报
回复
再解释下问题五: sizeof(LNode)你可以把LNode看成当成一种数据类型来看待,就像sizeof(int)
Alexander 2012-11-12
  • 打赏
  • 举报
回复
引用 3 楼 generalhking 的回复:
C/C++ code12345typedef struct LNode{...}LN, *LinkedList;可以拆分成:typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。typedef struct LNode{...}*LinkedList;//=>typedef……
+1 “别名声明”与变量声明一样,属于“声明表达式”,它们都可以按逗号分拆成较小的声明。例如变量声明: int a=2,b=a,*c=&b; 可以分拆成: int a=2; int b=a; int *c=&b; 另外,关于最后一个问题。对于编译期长度未知的数组,在C99标准里可以用变长数组(VA)实现:

#include<stdio.h>

//只有C99标准支持

typedef struct
{
    int n;
}f;

int main()
{
    int m;
    register int i;

    printf("m=");
    scanf("%d",&m);

    f fl[m];

    for(i=0;i<m;i++)
    {
        rewind(stdin);
        scanf("%d",&f1[i].n);
    }

    return(0);
}
支持C99的编译器在下只知道一款gcc。而C89不支持可变数组,如果要在运行时确定数组长度的话通常用动态分配的方式:

#include<stdio.h>

/*C89也支持*/

typedef struct
{
    int n;
}f;

int main()
{
    int m;
    f *f1;
    register int i;

    printf("m=");
    scanf("%d",&m);

    f1=(f*)malloc(m*sizeof(f));

    for(i=0;i<m;i++)
    {
        rewind(stdin);
        scanf("%d",&f1[i].n);
    }

    free(f1);

    return(0);
}
转角天边 2012-11-12
  • 打赏
  • 举报
回复
第三题和第四题差不多 LinkedList L;完全可以换成LNode * l;
转角天边 2012-11-12
  • 打赏
  • 举报
回复
2、可以理解成typedef struct LNode * LinkedList
转角天边 2012-11-12
  • 打赏
  • 举报
回复
1、楼主看下我写的这个例子

	typedef int a;
	typedef a   a;
	a  b=10;
	cout<<b<<endl;
lbq199204 2012-11-12
  • 打赏
  • 举报
回复
引用 5 楼 startservice 的回复:
最后一个可以用new C/C++ code12345 LNode *l = new LNode[n];// ...................... delete []l;
他说的是c吧!不是C++,c中没有new这个关键字的。 可以参照另外一个贴。 http://bbs.csdn.net/topics/370031564
startservice 2012-11-12
  • 打赏
  • 举报
回复
最后一个可以用new
	

	LNode *l = new LNode[n];
//      ......................
	delete []l;
lbq199204 2012-11-12
  • 打赏
  • 举报
回复
问题一:不太明白你的意思, 问题二:*LinkedList,先举个例子吧,例如 int * p,那p 就是int *类型的。那接下来LinkedList就是struct LNode *的别名。(不知道这样说,你有没有看懂!) 问题三:是的,是指针类型(可参照问题二的解答。),另外你的(如果针对结构体一来说,如果定义一个链域是不是要LN *L才行呢?)我不知道你要表达什么意思。 问题四:可以,就想当你typedef int INT ,你用sizeof(int)和sizeof(INT)都是一样的。 问题五:由于问题一,没看明白,所以。。。 最后一个问题,如果静态定义那个数组的长度,你要事先定义好,而你的要求是长度由程序运行时,手动输入,所以只能用malloc。 个人微见,希望能帮到你。
HAN-Kai 2012-11-12
  • 打赏
  • 举报
回复
typedef struct LNode{...}LN, *LinkedList;
可以拆分成:
typedef struct LNode{...}LN;//=>typedef struct LNode LN;类型LN相当于struct LNode型。
typedef struct LNode{...}*LinkedList;//=>typedef struct LNode* LinkedList; 类型LinkedList相当于LNode*型。
typedef struct LNode{...}LNode;是类型名和struct重名。
armsword 2012-11-12
  • 打赏
  • 举报
回复
问题一,你理解没问题,是的。 问题二,其实质应该是定义了新类型,你可以认为把struct LNode * 命名为 LinkedList。 问题三,没太明白你什么意思。 问题四,可以。 问题五, sizeof()里面应该是类型名,紧跟struct后面那个是标签,所以应该是大括号后面的LNode. 最后一个,使用 ->
加载更多回复(1)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧