list的存储结构体
㈠ C语言中怎样用链表保存结构体数据(动态数据结构)
链表有多种形式,如:单向链表,双向链表,单向循环链表,双向循环链表。将链表结构定义为list_t,则该类型中一定(至少)存在一个指向下一节点的指针list_t
*next;除了这个指针,list_t
中可以包含其它类型的数据,包括结构体变量。比如:typedef
struct
{
struct
usr_struct
data;
list_t
*next;
}
list_t;
㈡ STL的list容器如何对结构体进行排序
链表list有自定义的sort排序函数,默认由大到小排序,但是只有能够比较大小的数值类型的内容才可以,如int,float,double等,对于结构体需要自己定义排序函数。
例如:
定义结构体:
typedef
struct
NewTreeElem
{
long
nNodeId;
//节点id
int
nLevel;
//层次
double
dSoIn;
//社会影响
};
定义全局比较函数,注意必须是全局函数:
////比较
boolCompInfo(NewTreeElem
first,
NewTreeElem
second)
{
if(first.dSoIn
<=
second.dSoIn)
//由大到小排序
//如果想要由小到大,改为大于即可
{
return
false;
}
else
{
return
true;
}
}
定义链表:
list<NewTreeElem>
listSocialInf
链表排序:
//对邻居按照社会影响由大到小排序
listSocialInf.sort(CompInfo);
㈢ 给出单链表结构体的定义,分别定义结点和链表的结构体
我推荐使用类来定义结构和方法,毕竟这是基础类,需要使用模板和强大的封装性
program with c++
//这是链表结构的定义
#ifndefARRAYLIST_H
#defineARRAYLIST_H
#include"arrayListNode.h"
template<classT>
classarrayList
{
public:
arrayList();
virtual~arrayList();
//添加元素方法
voidadd(Tdata);
//移除某个元素
voidremove(inti);
//获取迭代器指向的值,为迭代提高效率
TgetNext();
//获取第一个元素
TgetFirst();
//获取最后一个元素
TgetEnd();
//清空
voidflush();
//获取长度
intgetSize();
private:
//这是链表的头
arrayListNode<T>*head;
//这是链表的长度
intsize;
//这是一个迭代器,用来指向当前操作的链表元素,用于GETNEXT之类的函数
arrayListNode<T>*nowSelect;
};
#endif//ARRAYLIST_H
下面是链表元素的结构
//链表元素,最理想的存储是用指针存储T类型数据以应对用户类型的存储,但是这很不直观,这里只给出能存储标准类型的非指针存储,也可以存储结构体
#ifndefARRAYLISTNODE_H
#defineARRAYLISTNODE_H
template<classT>
classarrayListNode
{
public:
arrayListNode();
virtual~arrayListNode();
//设置下一个指针值,这个函数给arraylist用
voidsetNext(arrayListNode*inNext);
//设置元素
voidsetData(Tindata);
//获取元素
TgetData();
private:
//元素值
Tdata;
//指向下一个元素的指针
arrayListNode<T>*next;
};
#endif//ARRAYLISTNODE_H
下面根据问主的需求写出C能用的结构体链表结构
template<classT>
structlistNode{
Tdata;
listNode<T>*next;
};
template<classT>
structarrayList{
listNode<T>*head;
intsize;
listNode<T>*nowSelect;
};
我以前写的arrayList ,stack等C++ util随着时间流逝已经找不到了,不然可以分享给问主了。
㈣ STL的list容器如何对结构体进行排序
链表list有自定义的sort排序函数,默认由大到小排序,但是只有能够比较大小的数值类型的内容才可以,如int,float,double等,对于结构体需要自己定义排序函数。
例如:
定义结构体:
typedef struct NewTreeElem
{
long nNodeId; //节点id
int nLevel; //层次
double dSoIn; //社会影响
};
定义全局比较函数,注意必须是全局函数:
////比较
boolCompInfo(NewTreeElem first, NewTreeElem second)
{
if(first.dSoIn <= second.dSoIn) //由大到小排序 //如果想要由小到大,改为大于即可
{
return false;
}
else
{
return true;
}
}
定义链表:
list<NewTreeElem> listSocialInf
链表排序:
//对邻居按照社会影响由大到小排序
listSocialInf.sort(CompInfo);
㈤ C# 结构体成员 list
因为 cc=bb这一句,cc 和 bb 虽然都是结构体,但这个结构体里面有 List,List并没有重新实例化,所以 cc 和 bb 里面的 List 其实是同一个。
㈥ c++ list读取csv文件,并将每列数据保存到结构体中
[cpp] view plain
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
//删除字符串中空格,制表符tab等无效字符
string Trim(string& str)
{
//str.find_first_not_of(" \t\r\n"),在字符串str中从索引0开始,返回首次不匹配"\t\r\n"的位置
str.erase(0,str.find_first_not_of(" \t\r\n"));
str.erase(str.find_last_not_of(" \t\r\n") + 1);
return str;
}
int main()
{
ifstream fin("test1.csv"); //打开文件流操作
string line;
while (getline(fin, line)) //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取
{
cout <<"原始字符串:"<< line << endl; //整行输出
istringstream sin(line); //将整行字符串line读入到字符串流istringstream中
vector<string> fields; //声明一个字符串向量
string field;
while (getline(sin, field, ',')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
{
fields.push_back(field); //将刚刚读取的字符串添加到向量fields中
}
string name = Trim(fields[0]); //清除掉向量fields中第一个元素的无效字符,并赋值给变量name
string age = Trim(fields[1]); //清除掉向量fields中第二个元素的无效字符,并赋值给变量age
string birthday = Trim(fields[2]); //清除掉向量fields中第三个元素的无效字符,并赋值给变量birthday
cout <<"处理之后的字符串:"<< name << "\t" << age << "\t" << birthday << endl;
}
return EXIT_SUCCESS;
㈦ 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等数据结构,非常适合特别大的数据量保存和查找,链表的查找很慢的,找一个数据相当于要把链表全部过一遍。
㈧ C语言怎么存链表形式的结构体文件
看你的代码是每次写入一个节点到文件,但是fwrite(p,sizeof(struct room),NUM,fp);这句是每次写入NUM大小的一个room数组,把NUM改成1:
fwrite(p,sizeof(struct room),1,fp); //每次写入一个节点
㈨ redis的list可以存放结构体吗
当然可以有结构体,而且像你这样用当然不行find(start,stop,target)是从start到stop寻找数据是target的那个iterator,而你这里呢,List_d.begin()的reference_type是structdd,所以你也只能找structdd型的东西(当然你也必须有structdd的operator==),而你给的第三个参数是个int,这当然没戏。