欢迎来到一句话经典语录网
我要投稿 投诉建议
当前位置:一句话经典语录 > 心得体会 > 链表心得体会

链表心得体会

时间:2018-10-18 08:35

求一篇4000字左右的关于C语言链表的学习心得

好象不是循环链表吧. pf=pb\\\/\\\/这句是看你是否真正懂了整个创建过程,pb是指像当前最新创建的结点,而pf则指向上一个结点 每次从开始循环 pb指向新创建的

双向循环链表为空的条件

\\\/*看后面的运行结果*\\\/# include # include typedef int ElemType;typedef int Status;\\\/\\\/双向链表存储结构typedef struct DuLNode{ ElemType data; DuLNode * prior,* next;}DuLNode,* DuLinkList;\\\/\\\/产生空的双向循环链表L,void InitList(DuLinkList * L){ * L = (DuLinkList)malloc(sizeof(DuLNode)); if (* L) { (* L)->next = (* L)->prior = * L; } else { exit(-1); }}\\\/\\\/将L重置为空表void ClearList(DuLinkList L){ DuLinkList q,p = L->next;\\\/\\\/p指向第一个结点 while (p != L) { q = p->next; free(p); p = q; } L->next = L->prior = L;\\\/\\\/头结点的两个指针域指向自己}\\\/\\\/线性表L已经存在,如果L为空表,则返回1,否则返回0Status ListEmpty(DuLinkList L){ if (L->next==L && L->prior==L) { return 1; } else { return 0; }}\\\/\\\/L已经存在,返回L中数据元素的个数int ListLength(DuLinkList L){ int i = 0; DuLinkList p = L->next;\\\/\\\/p指向第1个结点 while (p != L) { i++; p = p->next; } return i;}\\\/\\\/返回双向链表L的第i个元素的地址,如果i = 0,则返回头结点的地址\\\/\\\/如果第i个元素不存在,则返回NULLDuLinkList GetElemP(DuLinkList L,int i){ int j; DuLinkList p = L;\\\/\\\/p指向头结点 if (i<0 || i>ListLength(L)) { return NULL; } for (j=1; j<=i; ++j) { p = p->next; } return p;}\\\/\\\/在带头结点的双链循环线性表L中的第i个位置之前插入元素e,\\\/\\\/i的合法值是1=ListLength(L)+1) { return 0; } p = GetElemP(L,i-1); if (!p) { return 0; } s = (DuLinkList)malloc(sizeof(DuLNode)); if (!s) { return -1; } s->data = e; s->prior = p; s->next = p->next; p->next->prior = s; p->next = s; return 1;}\\\/\\\/由双链循环线性表L的头结点出发,正序对每个元素调用函数visit\\\/\\\/主要是正序void ListTraverse(DuLinkList L,void(*visit)(ElemType)){ DuLinkList p = L->next;\\\/\\\/p指向头结点 while (p != L) { visit(p->data); p = p->next; } printf(\\\ );}void print(ElemType c){ printf(%d ,c);}int main(void){ DuLinkList L; int i,n; Status j; ElemType e; InitList(&L); printf(***向双向循环链表中插入5个元素***\\\ ); for (i=1; i<=5; ++i) { ListInsert(L,i,i); } printf(正序输出链表元素:); ListTraverse(L,print); printf(链表的元素个数为%d\\\ ,ListLength(L)); printf(链表是否空:%d(1:空 0:非空)\\\ ,ListEmpty(L)); ClearList(L); printf(清空后,链表空吗:%d(1:空 0:非空)\\\ ,ListEmpty(L)); return 0;}\\\/*在vc++6.0中的输出结果:------------------------***向双向循环链表中插入5个元素***正序输出链表元素:1 2 3 4 5链表的元素个数为5链表是否空:0(1:空 0:非空)清空后,链表空吗:1(1:空 0:非空)Press any key to continue------------------------------总结:*\\\/

如何学习链表啊

老兄我服你了。

1: 首先 定义了head,p1,p2三个指向struct student的指针。

然后对p1,p2开辟空间,也就是开辟了struct student这个结构体空间,这两个指针分别都包含了一个num,一个score和一个指向struct student的next指针p1是指针,->这个符号,你自己看教科书,里面肯定有p1->num就是指针p1所指向student结构体里的num变量,也就是说单独的p1是指针,但p1->num就不是指针了,而是一个变量,就是long num,只不过是p1里面的,可以这么理解。

所以&p1->num就可以理解了,因为p1->num是个变量嘛。

这就是你所说的结构体指针指向结构体域成员。

p2是同样的道理。

但是head这个指针目前还不可以,因为head只是指向struct student这个指针而已。

也就是说head里面什么都没有。

除非让head指向p1,这是后话了,第二个问题再说。

这一段就告一段落。

2:我们开始看while循环首先n=1了,if判断后head=p1;这就是说head指向了p1,也就是说head可以head->num,head->score,head->next了然后if语句过,p2=p1,这和head=p1是一个道理。

这时head=p2=p1然后对p1重新分配了一个空间,对p1里面的num,score进行赋值如果num赋值不为0的话继续。

那就继续,这时n又加1了,n=2以后的if判断都是执行else了因为上一轮循环p2=p1,所以p2->next=NULL也就是为空,要知道next是指向struct student的所以p2->next=p1;,就相当于将p2里的next指针指向了上一轮里的刚创建的p1了这时head=p2但p2->next=p1;head->next=p1;然后p2=p1这时head->next=p2;head->next=p1然后对p1重新分配了一个空间,对p1里面的num,score进行赋值如果num赋值不为0的话继续。

p2->next=p1后这时head->next=p2;p2->next=p1。

也就是说head->next->next=p1head->next->next=p1的意思是,head->next是指向struct student的指针,这个指针指向的指针里的next再指向p1然后p2=p1这时head->next->next=p2;head->next->next=p1然后继续循环p2->next=p1后head->next->next->next=p1p2=p1后head->next->next->next=p2就这样循环直到p1->num==0这时循环结束,最后创建的p1不加入链表因为p2一直是链表的最后一个指针所以循环结束后再对p2->next=NULL,让p2指向空,也就是对链表进行收尾。

head是头指针嘛,head的位置一直在第一个,所以将head返回,可能你要问后面的数据怎么办

别忘了head->next嘛,就是指向后面的了总结其实p2是不需要对它进行分配空间的。

p2和head其实是一个原理。

还不懂的话可以加我百度hi,但我只是休假日在。

关于链表中的疑问

首先第一个:struct stua { int a; char b; struct stub c; };这里的话如果struct stub已经定义过,那么也就是它的内存空间也就确定了,所以这里这么嵌套定义是可以的。

第二个:struct stua { int a; char b; struct stua c; };这里是因为 struct stua还没有定义完,也就是占的内存空间还不确定,这时嵌套自身的话,编译器是不知道结构体的大小,不知道怎么分配空间,故是错误的。

第三个:struct stua { int a; char b; struct stua *c; };那为什么这里就是对的呢

分析:这里虽然也是嵌套自身,但是这里的变量c是个结构体指针,我们知道指针变量自身占的内存空间在同一平台下所有类型的指针变量所占的内存空间是一样的,例如32位平台占的内存空间大小是4 Bytes,也就是这时候结构体struct stua的内存空间是确定的,故这里是正确的。

总结,我们知道在定义一个任何类型的变量的时候,编译器就会给它分配一块相应大小的内存空间,也就是说,在定义一个变量时编译器必须知道它占内存空间的大小,否则不知道分配多大的空间给它。

就类似你定义一个数组变量的时候,如果你数组的大小不确定,编译器会同样会报错,道理是一样的。

希望对你有帮助

声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。联系xxxxxxxx.com

Copyright©2020 一句话经典语录 www.yiyyy.com 版权所有

友情链接

心理测试 图片大全 壁纸图片