user-0 提问: 关于建立链表时结构体的一些问题

回复:
user: user-0
content: 引用 8 楼 user-1 的回复:[quote=引用 6 楼 olewa_HHH 的回复:] [quote=引用 5 楼 user-1 的回复:] typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识 [/quote]  L是个结构体变量，所以L.tail  tail是个指向结构体的指针，所以tail->data, data也是个结构体变量，所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的，这也是我自己的学习路线。之后准备学啥就看你自己的喜好了，我之后又去学了c++，前段时间才看完c++primer，准备再看一遍。还有传智播客的网上有很多免费的视频，感觉讲的挺好的，有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够，反正就是个领你上个道儿，后续的书籍也可以参考论坛里很多大神们推荐的书籍，看个2，3遍肯定是要的。[/quote]  typedef struct ElemType{ 	float coef; 	int expn; }ElemType;  typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LinkList,*Polynomial;  //构造一个空链表 Status InitList(Polynomial L){ 	L = (Polynomial)malloc(sizeof(LNode)); 	if (!L) exit(OVERFLOW); 	(*L).next = NULL; 	return OK; }   //在链表尾后加入节点 Status MakeNode(Polynomial L, ElemType e){ 	Polynomial q; 	q = (Polynomial)malloc(sizeof(LNode)); 	if (!q) exit(OVERFLOW); 	(*q).data.coef = e.coef; 	(*q).data.expn = e.expn; 	(*q).next = NULL; 	while (NULL != L)  L = (*L).next; 	L = q; 	return OK; }  void main() { 	Polynomial A, B; 	InitList(A); 	InitList(B); } 能否帮忙纠错MakeNode函数，while (NULL != L)是死循环，然而我找不出原因

user: user-0
content: 知道错误了，谢谢

user: user-1
content: 1.对的 2.前者 3.LNode temp; L->next = &temp;

user: user-1
content: 引用 6 楼 olewa_HHH 的回复:[quote=引用 5 楼 user-1 的回复:] typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识 [/quote]  L是个结构体变量，所以L.tail  tail是个指向结构体的指针，所以tail->data, data也是个结构体变量，所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的，这也是我自己的学习路线。之后准备学啥就看你自己的喜好了，我之后又去学了c++，前段时间才看完c++primer，准备再看一遍。还有传智播客的网上有很多免费的视频，感觉讲的挺好的，有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够，反正就是个领你上个道儿，后续的书籍也可以参考论坛里很多大神们推荐的书籍，看个2，3遍肯定是要的。

user: user-0
content: #include<stdio.h> #include<stdlib.h>  #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //增强语言描述功能  typedef int Status;  typedef struct ElemType{ 	float coef; 	int expn; }ElemType;  typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LinkList,*Polynomial;  //构造一个空链表 Status InitList(Polynomial L){ 	L = (Polynomial)malloc(sizeof(LNode)); 	if (!L) exit(OVERFLOW); 	(*L).next = NULL; 	return OK; }   //在链表尾加入节点 Status MakeNode(Polynomial L, ElemType e){ 	Polynomial q; 	Polynomial p = L; 	q = (Polynomial)malloc(sizeof(LNode)); 	if (!q) exit(OVERFLOW); 	(*q).data = e; 	(*q).next = NULL; 	while (NULL != (*L).next) 	{ 		L = (*L).next; 	} 	(*L).next = q; 	return OK; }  //销毁线性表L，L不再存在 Status DestroyList(Polynomial L){ 	Polynomial q; 	q = L; 	while (NULL != (*L).next) 	{ 		L = (*q).next; 		free(q); 		q = L; 	} 	return OK; }  //判断e是否在L中，是则返回OK，否则返回ERROR Status LocateElem(Polynomial L, ElemType e){ 	ElemType temp; 	while (NULL != (*L).next) 	{ 		temp = (*L).data; 		if (e.coef == temp.coef && e.expn == temp.expn) return OK; 		L = (*L).next; 	} 	return ERROR; }  //建立一个多项式链表 void CreatPolyn(Polynomial L,int n){ 	int m=0,i=0; 	Polynomial p=L; 	ElemType e; 	InitList(L); 	e.coef = 0.0; e.expn = -1; 	(*L).data = e; 	printf("The number of %d List:", n); 	scanf_s("%d", &m);//scanf可能会造成内在泄露 	for (i = 1; i <= m; i++) 	{ 		printf("number %d", i); 		printf("\ncoef is: ");  scanf_s("%d", &e.coef); 		printf("expn is: ");  scanf_s("%d", &e.expn); 		MakeNode(L, e); 		p = (*p).next; 	} }  void main() { 	LinkList PA, PB; 	Polynomial A=&PA,B=&PB; 	CreatPolyn(A, 1); 	CreatPolyn(B, 2); }  这段代码在运行时会提示出错，麻烦帮找错误！

user: user-0
content: 引用 5 楼 user-1 的回复:typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识

user: user-1
content: typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。

user: user-1
content: 引用 3 楼 olewa_HHH 的回复:[quote=引用 1 楼 user-1 的回复:] 1.对的 2.前者 3.LNode temp; L->next = &temp; Status MakeNode(LinKList *L, ElemType e){ LinKList *q; LinKList *p=L; q = (LinKList *)malloc(sizeof(LinKList)); if (!q) exit(OVERFLOW); (*q)->data = e; (*q)->next = NULL; while (NULL != *p) { L = p; *p = (*L)->next; } (*L)->next = *q; return OK; }  这段代码在(*q)->data = e;会出错，是什么原因呢？[/quote]  q是一个指向结构体的指针，如果对q进行了解引用，*q就是该指针所指向的结构体的对象，如果需要使用成员的话，请使用点操作符。所以应该是q->data， (*q).data这样使用结构中的成员。

user: user-0
content: 引用 1 楼 user-1 的回复:1.对的 2.前者 3.LNode temp; L->next = &temp; Status MakeNode(LinKList *L, ElemType e){ LinKList *q; LinKList *p=L; q = (LinKList *)malloc(sizeof(LinKList)); if (!q) exit(OVERFLOW); (*q)->data = e; (*q)->next = NULL; while (NULL != *p) { L = p; *p = (*L)->next; } (*L)->next = *q; return OK; }  这段代码在(*q)->data = e;会出错，是什么原因呢？

user: user-0
content: Status MakeNode(LinKList *L, ElemType e){ 	LinKList *q; 	LinKList *p=L; 	q = (LinKList *)malloc(sizeof(LinKList)); 	if (!q) exit(OVERFLOW); 	(*q)->data = e; 	(*q)->next = NULL; 	while (NULL != *p) 	{ 		L = p; 		*p = (*L)->next; 	} 	(*L)->next = *q; 	return OK; }  这段代码在(*q)->data = e;会出错，是什么原因呢？