链表c语言存储结构体?C语言中怎样用链表保存结构体数据
一、单链表怎样插入一个结构体结点c语言
单向链表只需要记住上面节点的指针即可,让上面指针指向你要插入的结构体节点的首位置,然后有两种情况:1.如果你要在链表中间插入,那么你插入的节点的指针指向原来的下一个节点; 2.如果在链表末尾插入,那么就直接将你插入节点的指针置为NULL
二、用c语言将字符串abcdef用链表存储
#include<stdio.h>
#include<stdlib.h>
//定义链表节点结构体
typedef struct node{
char data;
struct node*next;
} Node;
int main(){
char str[]="abcdef";//要存储的字符串
Node*head= NULL;//链表头指针,初始化为 NULL
Node*tail= NULL;//链表尾指针,初始化为 NULL
for(int i= 0; i< sizeof(str)- 1; i++){
//动态分配节点内存空间
Node*p=(Node*)malloc(sizeof(Node));
p->data= str[i];//存储字符数据
p->next= NULL;
if(head== NULL){
head= p;
} else{
tail->next= p;
}
tail= p;
}
//遍历链表并输出各节点数据
printf("链表存储的字符串为:");
for(Node*p= head; p!= NULL; p= p->next){
printf("%c", p->data);
}
printf("\n");
//释放链表节点的内存空间
Node*p= head;
while(p!= NULL){
Node*q= p->next;
free(p);
p= q;
}
return 0;
}
此代码利用循环遍历字符串中的每个字符,并为每个字符动态分配一个链表节点,将其连接成一个链表。然后,使用循环遍历链表并输出各节点数据。后,释放所有动态分配的链表节点内存空间,以避免内存泄漏。
三、C语言中结构体在内存中的存储方式
结构体在内存中的存储方式,和常规的C语言变量、常量存储方式类似,唯的不同在于对齐。
只所以要进行数据对齐是因为编译器对结构的存储的特殊处理能提高CPU存储变量的速度,一般来说,32位的CPU内存以4字节对齐,64位的CPU的以8字节的对齐。一般可以使用#pragma pack()来指出对齐的字节数。比如下面的代码,在debug会显示结构体test的内存大小为28,如果生成release版则所占内存大小为32。
#include<stdio.h>
#ifdef_DEBUG
#pragmapack(4)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#else
#pragmapack(8)
structtest
{
charx[13];//13
intd;//4
doublef;//8
}ss;
#endif
intmain(void){
printf("%d\n",sizeof(ss));
return0;
}
四、C语言中怎样用链表保存结构体数据***动态数据结构***
单向链表很简单的,你这几这么就可以了:
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等数据结构,非常适合特别大的数据量保存和查找,链表的查找很慢的,找一个数据相当于要把链表全部过一遍。