Code Bye

关于建立链表时结构体的一些问题

typedef struct ElemType{
float coef;
int expn;
}ElemType;

typedef struct LNode{
ElemType data;
struct LNode *next;
}*LinkList;

自己的理解:例如:LNode List;      LinKList L;     L=&List;
                     那么L为指向List的指针。
问题:1.我的理解的对错
           2.L内的成员data用于存储变量的值还是变量的地址
           3.若把某一地址赋给List内的成员next,那用L如何表示

10分
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;会出错,是什么原因呢?

引用 1 楼 guicaisa 的回复:

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;会出错,是什么原因呢?

10分
引用 3 楼 olewa_HHH 的回复:
Quote: 引用 1 楼 guicaisa 的回复:

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;会出错,是什么原因呢?

q是一个指向结构体的指针,如果对q进行了解引用,*q就是该指针所指向的结构体的对象,如果需要使用成员的话,请使用点操作符。所以应该是q->data, (*q).data这样使用结构中的成员。

10分
typedef struct LNode{
ElemType data;
struct LNode *next;
}*LinkList;
这句typedef已经将LinkList变为LNode*的别名了,所以你上面在定义p的时候直接LinkList p就行了,在加个*就是二级指针了。
引用 5 楼 guicaisa 的回复:

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.之前我学习的是谭浩强的书,没有关于结构体这方面的详细知识,请问在哪些书中有这方面的详细知识

#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);
}

这段代码在运行时会提示出错,麻烦帮找错误!

10分
引用 6 楼 olewa_HHH 的回复:
Quote: 引用 5 楼 guicaisa 的回复:

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.之前我学习的是谭浩强的书,没有关于结构体这方面的详细知识,请问在哪些书中有这方面的详细知识

L是个结构体变量,所以L.tail  tail是个指向结构体的指针,所以tail->data, data也是个结构体变量,所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的,这也是我自己的学习路线。之后准备学啥就看你自己的喜好了,我之后又去学了c++,前段时间才看完c++primer,准备再看一遍。还有传智播客的网上有很多免费的视频,感觉讲的挺好的,有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够,反正就是个领你上个道儿,后续的书籍也可以参考论坛里很多大神们推荐的书籍,看个2,3遍肯定是要的。

引用 8 楼 guicaisa 的回复:
Quote: 引用 6 楼 olewa_HHH 的回复:
Quote: 引用 5 楼 guicaisa 的回复:

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.之前我学习的是谭浩强的书,没有关于结构体这方面的详细知识,请问在哪些书中有这方面的详细知识

L是个结构体变量,所以L.tail  tail是个指向结构体的指针,所以tail->data, data也是个结构体变量,所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的,这也是我自己的学习路线。之后准备学啥就看你自己的喜好了,我之后又去学了c++,前段时间才看完c++primer,准备再看一遍。还有传智播客的网上有很多免费的视频,感觉讲的挺好的,有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够,反正就是个领你上个道儿,后续的书籍也可以参考论坛里很多大神们推荐的书籍,看个2,3遍肯定是要的。


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)是死循环,然而我找不出原因

知道错误了,谢谢

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于建立链表时结构体的一些问题