當前位置:首頁 » 存儲配置 » c存儲list

c存儲list

發布時間: 2022-08-07 06:43:48

⑴ mfc中CList能存放指針不

指針List應該是這樣定義吧:Clist<Drawing*,Drawing*> Mylist;
這個類如果想直接傳進CList應該要有拷貝構造函數和『=』重載

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等數據結構,非常適合特別大的數據量保存和查找,鏈表的查找很慢的,找一個數據相當於要把鏈表全部過一遍。

⑶ CList的用法

建一個struct來保存這4個變數,然後建一個該結構的CList做為CCylinder類的成員.你可以重載[]操作符來取任意位置的薄片信息.

⑷ c++ lIst的對象如何保存在文件中

這個問題得研究一下list的源碼
list本身和list的節點是不同的結構,首先看list的節點結構:
template<class
T>
struct
__list_node{
typedef
void*
void_pointer;
void_pointer
prev;
void_pointer
next;
T
data
}
從這里可以看出,list中用於存儲不同類型的值,如int
或者
float
會影響list的節點的大小。
而list本身的結構如下:
template<class
T>
class
list{
protected:
typedef
__list
node<T>
list_node;
public:
typdefef
__list
node*
link_type;
protected:
link_type
node;//只要一個指針,便可表示整個list
...
}
從這里可以看出,
list中僅僅是保存了一個指向其節點的指針,
所以當對list使用sizeof的時候,
只會計算這個指針的佔用的空間大小,
和整個list所指向的鏈表有多少個節點無關。
也就是說sizeof(list<double>)始終都是同一個值。
如果想知道list中存放了多少個值,可以調用list.size();
至於把list中的內容寫到文件上,可以循環的讀取list中的內容,然後再寫至相應的文件
下面是我寫的一段代碼(VS2005編譯器),樓主可以參考一下:
#include<iostream>
#include<fstream>
#include<iostream>
#include<list>
using
namespace
std;
int
main()
{
fstream
file("test.txt",fstream::out);
list<int>
int_list;
cout<<sizeof(int_list)<<endl;//cout<<24
cout<<int_list.size()<<endl;//cout<<0
for(int
i=0;i<100;i++)
int_list.push_back(i);
cout<<sizeof(int_list)<<endl;//cout<<24
cout<<int_list.size()<<endl;//cout<<100
for(list<int>::const_iterator
it=int_list.begin();it!=int_list.end();it++)
file<<*it<<endl;//cin
to
file
file.clear();
file.close();
}

⑸ 如何用C語言或C++實現一個List類

  1. C語言沒有類的概念。C++有現成的List類, #include<list>即可。

  2. 如果要自己實現可以參考C++數據結構的書籍,是最基本的練習。

    這里實現一個簡單的常式,請參考:

    #include<iostream>
    #include<fstream>
    #include<stdlib.h>
    #include<string.h>
    usingnamespacestd;
    #include<stdio.h>
    #include<string>

    #include"math.h"

    template<classT>classList{
    public:
    List()//構造函數
    {
    pFirst=NULL;
    }

    voidAdd(T&t)//在Link表頭添加新結點
    {
    if(pFirst==NULL)
    {
    pFirst=newNode;
    *(pFirst->pT)=t;
    }
    else
    {
    Node*pNewNode=newNode;
    *(pNewNode->pT)=t;
    pNewNode->pNext=pFirst;
    pFirst=pNewNode;
    }
    }

    voidRemove(T&t)//在Link中刪除含有特定值的元素
    {
    Node*pNode=pFirst;
    if(*(pNode->pT)==t)
    {
    pFirst=pFirst->pNext;
    deletepNode;
    return;
    }
    while(pNode!=NULL)
    {
    Node*pNextNode=pNode->pNext;
    if(pNextNode!=NULL)
    {
    if(*(pNextNode->pT)==t)
    {
    pNode->pNext=pNextNode->pNext;
    deletepNextNode;
    return;
    }
    }
    else
    return;//沒有相同的

    pNode=pNode->pNext;
    }
    }
    T*Find(T&t)//查找含有特定值的結點
    {
    Node*pNode=pFirst;
    while(pNode!=NULL)
    {
    if(*(pNode->pT)==t)
    {
    returnpNode->pT;
    }
    pNode=pNode->pNext;
    }
    returnNULL;
    }
    voidPrintList()//列印輸出整個鏈表
    {
    if(pFirst==NULL)
    {
    cout<<"列表為空列表!"<<endl;
    return;
    }
    Node*pNode=pFirst;
    while(pNode!=NULL)
    {
    cout<<*(pNode->pT)<<endl;
    pNode=pNode->pNext;
    }
    }
    ~List()
    {
    Node*pNode=pFirst;
    while(pNode!=NULL)
    {
    Node*pNextNode=pNode->pNext;
    deletepNode;
    pNode=pNextNode;
    }
    }
    protected:
    structNode{
    Node*pNext;
    T*pT;

    Node()
    {
    pNext=NULL;
    pT=newT;
    }
    ~Node()
    {
    deletepT;
    }
    };
    Node*pFirst;//鏈首結點指針
    };

    classStudent
    {
    public:
    charid[20];//學號
    charname[20];//姓名
    intage;//年齡
    Student()
    {
    }
    ~Student()
    {
    }
    Student(constchar*pid,constchar*pname,int_age)
    {
    strcpy(id,pid);
    strcpy(name,pname);
    age=_age;
    }
    booloperator==(constStudent&stu)
    {
    returnstrcmp(id,stu.id)==0&&strcmp(id,stu.id)==0&&age==stu.age;
    }
    Student&operator=(constStudent&stu)
    {
    strcpy(id,stu.id);
    strcpy(name,stu.name);
    age=stu.age;
    }
    friendostream&operator<<(ostream&out,constStudent&stu);
    };
    ostream&operator<<(ostream&out,constStudent&stu)
    {
    out<<"id:"<<stu.id<<" name:"<<stu.name<<" age:"<<stu.age<<endl;
    }

    intmain()
    {
    List<Student>stuList;
    cout<<"添加學生前:"<<endl;
    stuList.PrintList();

    Studentstu1("1","張三",18);
    Studentstu2("2","李四",18);
    Studentstu3("3","王五",18);
    Studentstu4("4","至尊寶",18);
    Studentstu5("5","豬八戒",18);
    Studentstu6("6","唐僧",18);
    Studentstu7("7","沙和尚",18);
    Studentstu8("8","觀音",18);
    stuList.Add(stu1);
    stuList.Add(stu2);
    stuList.Add(stu3);
    stuList.Add(stu4);
    stuList.Add(stu5);
    stuList.Add(stu6);
    stuList.Add(stu7);
    stuList.Add(stu8);
    cout<<"添加學生後:"<<endl;
    stuList.PrintList();


    Studentstu11("1","張三",18);
    Student*pStu=stuList.Find(stu11);
    cout<<"查找到的同學是:"<<*pStu;

    stuList.Remove(stu11);
    cout<<" 刪除第一個後:"<<endl;
    stuList.PrintList();

    return0;
    }

⑹ mfc中如何使用CList存放指針變數

比如結構體Struct pNode{
BYTE* p;
public:
pNode{
p = NULL;
}
~pNode{
if(!p){
delete p;
p = NULL;
}
}
}

添加的話
{
pNode* pTemNode = new pNode;
Mylist.AddTail(pTemNode);
}
如果讓添加的結構體中的指針要指向數據,直接開辟一片內存,讓他指向就okay了

⑺ c 如何將list放入數組

用List的 toArray(T[] t) 方法就行。
例子 整數和字元串,其它都一樣。

List<Integer> a=new LinkedList<Integer>(); for(int i=0;i<50;i++) a.add(i); Integer[] b=new Integer[a.size()]; b=a.toArray(b); System.out.println(Arrays.toString(b)); List<String> c=new LinkedList<String>(); StringBuilder sb=null; for(int i=0;i<50;i++){ sb=new StringBuilder(); for(int j=0;j<10;j++) sb.append((char)((Math.random()*26)+65)); c.add(sb.toString()); } String[] d=new String[c.size()]; d=c.toArray(d); System.out.println(Arrays.toString(d));

⑻ mfc中Clist內存釋放的問題

這個跟CList沒有關系吧,看CList的裡面存儲的是什麼類型來著
如果是new 或malloc分配的對象就要手動釋放

⑼ c語言程序中,定義幾個字元數組,在內存中是怎麼存儲的

strcat(test,list);是把list連接到test之後,test就變成了之前的test+list。最後輸出是正常的。如下圖

⑽ 利用c語言實現順序存儲線性表的插入!

有時會出現這種情況。他會以為是木馬。
int GetElem();
int InstInsert();
typedef int ElemType;
typedef struct{
ElemType *elem; //存儲空間基地址
int length; //當前長度
int listsize;//當前分配的存儲容量
}SqList;
int InitList(SqList *L){
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)exit(-1);//存儲空間分配失敗
L->length=0; //空表長度為0
L->listsize=LIST_INIT_SIZE; //初始存儲容量
printf("線性鏈表創建成功\n");
return OK;
}
int Input(SqList *L){
ElemType temp,*newbase;
printf("輸入順序列表的數據,以0為結束標志\n");
scanf("%d",&temp);
while(temp!=0){
if(L->length>=L->listsize){
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!newbase) exit(-1);//存儲空間分配失敗
L->elem=newbase; //空間新基地址
L->listsize+=LISTINCREMENT; //增加存儲容量
}
L->elem[L->length++]=temp;
scanf("%d",&temp);
}
printf("輸入數據結束!!\n");
return OK;
}
int Onput(SqList *L){
int i=0;
printf("輸出線性表數據:");
while(i<L->length){
printf("%d\t",L->elem[i]);
i++;
}
printf("\n");
}
int ClearList(SqList *L){
L->length=0;
printf("清除成功!\n");
return OK;
}
void ListEmpty(SqList L){
if(L.elem!=NULL)
printf("true!\n");
else
printf("false!\n");
}
void ListLength(SqList L){
printf("線性表的長度是:%d\n",L.length);
return ;
}
int GetElem(SqList L,int i,SqList *e){
e=L.elem[i-1];
return e;
}
void PriorElem(SqList L,int cur_e,SqList *pre_e){
if(cur_e!=L.elem[0]){
pre_e=L.elem[0];
printf("前驅值為:%d\n",pre_e);
}
else
printf("pre_e無意義\n");
}
void NextElem(SqList L,int cur_e,SqList *next_e){
if(cur_e!=L.elem[L.length-1]){
next_e=L.elem[L.length-1];
printf("後繼值為:%d\n",next_e);
}
else
printf("next_e無意義\n");
}
int ListInsert(SqList *L,int i,int e){
ElemType *newbase,*p,*q;
if(1>i||i>(L->length+1))
return -1;
if(L->length>=L->listsize){ //新增內存
newbase=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType)); //開辟新內存空間
if(!newbase)
exit(-1); //存儲分配失敗
L->elem=newbase; //新基地址
L->listsize+=LISTINCREMENT; //新增內存容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length-1]);p>=q;p--){
*(p+1)=*p;
}
*q=e;
++L->length;
return OK;
}
int ListDelete(SqList *L,int i,int e){
ElemType *p,*q;
if(i<1||i>L->length)
return -1;
q=&(L->elem[i-1]);
e=L->elem[i-1];
p=L->elem+L->length-1;
for(;p>=q;q++)
*q=*(q+1);
--L->length;
printf("刪除的值為:%d\n",e);
return OK;
}

熱點內容
rft屏幕代碼編譯 發布:2025-01-11 12:54:01 瀏覽:741
安卓手機怎麼清除後台 發布:2025-01-11 12:53:14 瀏覽:804
sgm郵箱伺服器地址 發布:2025-01-11 12:46:03 瀏覽:882
編程軟體基礎培訓 發布:2025-01-11 12:20:20 瀏覽:287
imeet網站伺服器地址 發布:2025-01-11 12:15:35 瀏覽:331
ps緩存時間 發布:2025-01-11 11:55:36 瀏覽:865
雲伺服器容災 發布:2025-01-11 11:51:40 瀏覽:682
phparraysplice 發布:2025-01-11 11:51:40 瀏覽:320
android學習源碼 發布:2025-01-11 11:26:23 瀏覽:413
伺服器都壞了如何恢復 發布:2025-01-11 11:24:04 瀏覽:354