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,這當然沒戲。