C语言中怎样用链表保存结构体数据(动态数据结构)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中怎样用链表保存结构体数据(动态数据结构)相关的知识,希望对你有一定的参考价值。
我在做一个银行账户管理系统,现在定义了一下结构体:
struct client
char account[14]; //账号
char name[10]; //名字
char identity[20]; //身份证号
char address[15]; //地址
long int money; //存款(可存可取)
;
因为考虑到用户数量应该没有上限,所以采用链表的动态数据结构,以达到目的。这里有几点疑问:
1.我准备用单链表,是用头插法好还是尾插法好呢?哪种更好实现数据的追加和删除呢?
2.我在定义了结构体后又定义了链表,如下所示:
struct client
char account[14];
char name[10];
char identity[20];
char address[15];
long int money;
;
/*定义记录用户数据的链表*/
struct node //定义节点类型node
char account[14];
char name[10];
char identity[20];
char address[15];
long int money;
struct node *next;
;
这样做对的吗?我想用链表对client结构体进行插入、遍历、删除、修改等操作,是不是在定义结构体之后再这样定义一个链表呢?
3.(重要)定义完链表之后,就要实现注册功能,按照要求,要把账号、姓名等信息以二进制流存储到文件当中,比如我要把account通过链表插入并保存到二进制文件中,应该怎么写呢?重点突出指针的定义和使用,像文件打开判断部分可以省略
重点:1)定义完链表后怎么定义和使用指向成员们的指针呢?
2)二进制文件是保存为.bat格式吗?
3)执行这条语句来保存输入的内容吗?
for(i=0;i<n;i++)
if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1) //为什么只有判断,没有保存的过程呢?
printf("flie write error\n");
fclose(fp);
我对以上的内容不是很了解,希望知道的人帮忙解答,谢谢了。
struct client
char account[14]; //账号
char name[10]; //名字
char identity[20]; //身份证号
char address[15]; //地址
long int money; //存款(可存可取)
client* pNext; //指向下一个节点,如果是最后一个节点则为NULL
;
然后,程序里只需要保存第一个节点就行了:
client* head = (client*)malloc(sizeof(client)); //第一个节点这么产生
head->pNext = NULL; //该表只有一个节点,所以第一个也是最后一个,别忘记赋0
插入的时候从头部插入就行了
client* p = (client*)malloc(sizeof(client));
p->pNext = head;
head = p; //将原来的头付给p的pNext指针,然后原来保存头元素的指针用p取代。
遍历链表更加容易了
client* pNode = head;
while (pNode)
printf(pNode->account); //比如打印所有客户的帐号
pNode = pNode->pNext; //让pNode指向下一个节点
//如果该节点是最后一个节点,那么pNode就会变成NULL,因为最后一个节点的pNext指针是NULL,while循环就会因为pNode为0而结束
保存进文件的时候相当于遍历一边所有的元素,读取的时候则一个一个读取,然后重新插入链表。最后,提醒一下的是别忘记用free释放由malloc分配的内存。
另外,考虑使用C++,可以更好的管理内存,思路也会更清晰。而且,如果是为了应用,根本不需要自己开发链表类,用STL就可以了,STL不仅提供双向链表,还有Map,HashMap等数据结构,非常适合特别大的数据量保存和查找,链表的查找很慢的,找一个数据相当于要把链表全部过一遍。 参考技术A 1.用头插法。因为数据追加和删除比较多,追加的话,头插法可以直接插,用尾插降低了时间效率,删除用两个一样。
2./*结构体定义*/
struct client
char account[14];
char name[10];
char identity[20];
char address[15];
long int money;
;
/*链表结点定义*/
struct node
struct client band_inf;
struct node *next;
;
应该把结构体结点定义成链表的成员,这样链表才对。如果像你那样定义的话,完全不用定义结构体,链表就搞定了。因为你在链表里面把结构的成员都又定义了。
3.
1),定义结点:p1=(struct node*)malloc(sizeof(struct node)) ;表示定义一个node型的结点指针
使用,这个要看具体怎么用了。比如说删除searchp,priorp是searchp的前面一个结点,这样写
priorp->next=searchp->next;
delete searchp; 即可
插入newnode在searchp的后面,可以这样:
newnode->next=searchp->next;
searchp->next=newnode;
2)广义的二进制就是文件,你存成什么文件都行。.txt就行。
3)有保存的。if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)。里面有个fwrite就是写入文件,在判断的过程中,能写入文件的就已经写入了。 望采纳。本回答被提问者和网友采纳 参考技术B 链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t *next;除了这个指针,list_t 中可以包含其它类型的数据,包括结构体变量。比如:typedef struct
struct usr_struct data;
list_t *next;
list_t; 参考技术C p1=(struct studinf*)malloc(sizeof(struct studinf)) 表示开辟一段strunt 1.结构体和共用体类型数据的定义方法和引用方法。 2.用指针和结构体构成 参考技术D 厉害
C语言用链表管理你的感情史,方便又快捷,赶快试试吧!
这年就算是完了,再过不久假期也快过完了。高考后本以为大学四年的时光会很长。谁晓得再过不久就要开始大二下学期了,假期的时间其实也不短啦。尤其是对我。。。
刚刚开始学习数据结构,感觉线性表的链式存储,似乎很难呐。应该写代码巩固下才好。
来吧,开始管理你的女盆友们吧!!!
结构体方便我们组合不同的数据类型,首先用结构体组合一个女生的属性,组合如下
这要说下,c语言的struct修饰无法像c++那样,将girl变成类型,所以用了typedef给struct girl 起了个别名wife。
在circielist.h的头文件中,包含如下方法。稍后附上源码,功能可自行定制。。。是不是很贴心呐。。。
这个部分,有必要要给大家看下。
这是根据我的口味来的,也请大家看下,眼光是否还行呢。。。
代码也经过简单的测试了,如果还有bug,恳请大家指正。
代码纯属练习链表,娱乐而成。不喜勿怪呐。。。
(似乎还有些功能没有添加啊。。。有兴趣的同志们,可以将它完善完善。。。)
还有一事相求,小弟心中对一些事存有困惑。有望各位前辈告知。事情原委如下:
大一的时候,傻乎乎的,天真的以为天真的以为c/c++学好了,就能成为一名黑客,那个拉风酷炫拽啊。
其实,我不是为了装酷,大一时,被一个可恶人(也不晓得是不是黑客),通过网页支付时,转走了支付宝里的钱(父母的血汗能不恨吗?)。不过我却记下了那个号码。发誓,会让那无耻之徒付出代价的。于是,以彼之道还施彼身的念头冒出来了,这就是我编程的初衷了。
我的恨随着时光早就走远了。那件事也怪我当初贪图小便宜。
扯远了。。。
而今,C/C++已经初步完成学习,数据结构也快步入尾声。接下来我该学什么呢?windows编程还是linux编程?还是去学计算机网络?还是数据库?我不清楚。。。
请有经验的前辈指条明路。。。感激不尽。。。
本文出自 “11191137” 博客,请务必保留此出处http://11201137.blog.51cto.com/11191137/1742083
以上是关于C语言中怎样用链表保存结构体数据(动态数据结构)的主要内容,如果未能解决你的问题,请参考以下文章