如何用C語言或C++實現一個List類?
建網站原本是網站策劃師、網絡程序員、網頁設計師等,應用各種網絡程序開發技術和網頁設計技術配合操作的協同工作。創新互聯專業提供成都做網站、成都網站設計,網頁設計,網站制作(企業站、響應式網站、電商門戶網站)等服務,從網站深度策劃、搜索引擎友好度優化到用戶體驗的提升,我們力求做到極致!
C語言沒有類的概念。C++有現成的List類, #includelist即可。
如果要自己實現可以參考C++數據結構的書籍,是最基本的練習。
這里實現一個簡單的例程,請參考:
#include iostream#include fstream#include stdlib.h#include string.husing namespace std;#includestdio.h#includestring#include "math.h"templateclass T class List{public: List() 構造函數 { pFirst = NULL; } void Add(T t) 在Link表頭添加新結點 { if(pFirst == NULL) { pFirst = new Node; *(pFirst-pT) = t; } else { Node* pNewNode = new Node; *(pNewNode-pT) = t; pNewNode-pNext = pFirst; pFirst = pNewNode; } } void Remove(T t) 在Link中刪除含有特定值的元素 { Node* pNode = pFirst; if(*(pNode-pT) == t) { pFirst = pFirst-pNext; delete pNode; return; } while(pNode != NULL) { Node* pNextNode = pNode-pNext; if(pNextNode!=NULL) { if(*(pNextNode-pT) == t) { pNode-pNext = pNextNode-pNext; delete pNextNode; return; } } else return;沒有相同的 pNode = pNode-pNext; } } T* Find(T t) 查找含有特定值的結點 { Node* pNode = pFirst; while(pNode != NULL) { if(*(pNode-pT) == t) { return pNode-pT; } pNode = pNode-pNext; } return NULL; } void PrintList() 打印輸出整個鏈表 { 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; delete pNode; pNode = pNextNode; } }protected: struct Node{ Node* pNext; T* pT; Node() { pNext = NULL; pT = new T; } ~Node() { delete pT; } }; Node *pFirst; 鏈首結點指針};class Student{public: char id[20]; 學號 char name[20]; 姓名 int age; 年齡 Student() { } ~Student() { } Student(const char* pid, const char* pname, int _age) { strcpy(id, pid); strcpy(name, pname); age = _age; } bool operator==(const Student stu) { return strcmp(id, stu.id) == 0 strcmp(id, stu.id) == 0 age==stu.age; } Student operator=(const Student stu) { strcpy(id, stu.id); strcpy(name, stu.name); age = stu.age; } friend ostream operator (ostream out,const Student stu);};ostream operator (ostream out,const Student stu){ out"id:"stu.id"\tname:"stu.name"\tage:"stu.ageendl;}int main(){ ListStudent stuList; cout"添加學生前:"endl; stuList.PrintList(); Student stu1("1", "張三", 18); Student stu2("2", "李四", 18); Student stu3("3", "王五", 18); Student stu4("4", "至尊寶", 18); Student stu5("5", "豬八戒", 18); Student stu6("6", "唐僧", 18); Student stu7("7", "沙和尚", 18); Student stu8("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(); Student stu11("1", "張三", 18); Student* pStu = stuList.Find(stu11); cout"查找到的同學是:"*pStu; stuList.Remove(stu11); cout"\n\n刪除第一個后:"endl; stuList.PrintList(); return 0;}
如何用C語言實現一個類似C++中vector的功能
你先學習template,看看Vector是怎么造的,懂得了原理,vector簡單的,說穿了就是數組,數組是有大小的,當你要擴大到一定的時候,就會重新分配一個較大的數組,把先前的復制到新的數組中,這個是vector的致命缺陷~當要插入的量大的時候,但優點是訪問速度快。
個人博客::blog.csdn./what951006?viewmode=list
C語言如何用if實現一個循環
label if(conditiong)
{
expresstion;
goto label;
}
如何用C語言實現一個類似C++中vectorstring的功能
對于不可以operator overload的c語言來說,string就算實現也是半吊子工程。至于vector,c沒有template,所以也不可以。
請教各位大俠如何用C語言或者是C++實現一個對話框
自己實現是不太現實的
需要你自己來處理圖形界面 工作量太大。
最簡單的 就是用MFC 里面有現成的對話框函數 直接調用就好
也可以用minigui 或者QT一類的圖形插件。
如何用C++實現堆排序?不要C語言!
:baike.baidu./view/157305.htm這個網站里面有 你可以看一下
如何用c語言自己實現一個互斥體或臨界區
互斥體實現了“互相排斥”(mutual exclusion)同步的簡單形式(所以名為互斥體(mutex))。互斥體禁止多個線程同時進入受保護的代碼“臨界區”(critical section)。 每個進程中訪問臨界資源的那段代碼稱為臨界區(Critical Section)
如何用c++實現一個lru cache
其實關鍵不在于用C++還是什么,關于在于算法
一般可以使用一個map和一個雙向鏈表來實現lru
C語言如何用vb界面實現
C做界面用VC++
matlab中imagesc如何用C語言去實現
1.準備好C語言程序,清楚C語言的入口函數
2.編寫mexfunction函數。mexfunction函數為C語言與MATLAB語言的接口函數。調用實例在mylinedetect.c文件中.在MATLAB中調用mex指令編譯相關文件,將C語言編譯為MEX文件。
3.編譯完成后,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用于MATLAB與C語言接口函數.
4.編譯完成之后,編寫MATLAB函數,調用MEX文件。以MEX文件的形式調用編譯完成的C語言函數[o1,o2]=mylinedetect(double(X).');......
5.輸出結果,上述linedetect函數完成圖像中直線檢測功能,帶入MATLAB中調用后形成結果。
對于C語言中的函數類型,一般可以分為以下兩類:
1. 庫函數(Library Function):也稱為內置函數(Built-in Function),是由C語言提供的、已經封裝好的函數。庫函數通常具有標準化、通用化的特點,包括數學運算、字符串處理、文件操作等方面。例如`printf()`和`scanf()`是C語言中常用的庫函數。
2. 用戶自定義函數(User-Defined Function):也稱為外置函數(External Function),是程序員根據需求自行編寫的函數。用戶自定義函數可以將某一段需要重復使用的代碼封裝成一個函數,在其他地方調用該函數即可實現相同的功能,起到了復用代碼的作用。在需要多次執行特定任務時,使用自定義函數可以使程序結構更加清晰、易于理解。
1、createlist不是庫函數,一般是數據結構中實現新建一個鏈表的自定義函數。因此沒有什么用法好說的,關鍵是看自己怎么定義。
2、例程:
NODE?*creatlist(int?a[])
{?NODE?*h,*p,*q;int?i;
h=(NODE?*)malloc(sizeof(NODE));
h-next=NULL;
for(i=0;iN;i++)
{q=(NODE?*)malloc(sizeof(NODE));
q-data=a[i];
q-next=NULL;
if(h-next==NULL)?h-next=p=q;
else?{p-next=q;p=q;}?????}
return?h;
}
C++ Lists(鏈表)
Lists將元素按順序儲存在鏈表中. 與 向量(vectors)相比, 它允許快速的插入和刪除,但是隨機訪問卻比較慢.
assign() 給list賦值
back() 返回最后一個元素
begin() 返回指向第一個元素的迭代器
clear() 刪除所有元素
empty() 如果list是空的則返回true
end() 返回末尾的迭代器
erase() 刪除一個元素
front() 返回第一個元素
get_allocator() 返回list的配置器
insert() 插入一個元素到list中
max_size() 返回list能容納的最大元素數量
merge() 合并兩個list
pop_back() 刪除最后一個元素
pop_front() 刪除第一個元素
push_back() 在list的末尾添加一個元素
push_front() 在list的頭部添加一個元素
rbegin() 返回指向第一個元素的逆向迭代器
remove() 從list刪除元素
remove_if() 按指定條件刪除元素
rend() 指向list末尾的逆向迭代器
resize() 改變list的大小
reverse() 把list的元素倒轉
size() 返回list中的元素個數
sort() 給list排序
splice() 合并兩個list
swap() 交換兩個list
unique() 刪除list中重復的元素附List用法實例:#include iostream
#include list
#include numeric
#include algorithmusing namespace std;//創建一個list容器的實例LISTINT
typedef listint LISTINT;//創建一個list容器的實例LISTCHAR
typedef listchar LISTCHAR;void main(void)
{
//--------------------------
//用list容器處理整型數據
//--------------------------
//用LISTINT創建一個名為listOne的list對象
LISTINT listOne;
//聲明i為迭代器
LISTINT::iterator i; //從前面向listOne容器中添加數據
listOne.push_front (2);
listOne.push_front (1); //從后面向listOne容器中添加數據
listOne.push_back (3);
listOne.push_back (4); //從前向后顯示listOne中的數據
cout"listOne.begin()--- listOne.end():"endl;
for (i = listOne.begin(); i != listOne.end(); ++i)
cout *i " ";
cout endl; //從后向后顯示listOne中的數據
LISTINT::reverse_iterator ir;
cout"listOne.rbegin()---listOne.rend():"endl;
for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {
cout *ir " ";
}
cout endl; //使用STL的accumulate(累加)算法
int result = accumulate(listOne.begin(), listOne.end(),0);
cout"Sum="resultendl;
cout"------------------"endl; //--------------------------
//用list容器處理字符型數據
//-------------------------- //用LISTCHAR創建一個名為listOne的list對象
LISTCHAR listTwo;
//聲明i為迭代器
LISTCHAR::iterator j; //從前面向listTwo容器中添加數據
listTwo.push_front ('A');
listTwo.push_front ('B'); //從后面向listTwo容器中添加數據
listTwo.push_back ('x');
listTwo.push_back ('y'); //從前向后顯示listTwo中的數據
cout"listTwo.begin()---listTwo.end():"endl;
for (j = listTwo.begin(); j != listTwo.end(); ++j)
cout char(*j) " ";
cout endl; //使用STL的max_element算法求listTwo中的最大元素并顯示
j=max_element(listTwo.begin(),listTwo.end());
cout "The maximum element in listTwo is: "char(*j)endl;
}#include iostream
#include listusing namespace std;
typedef listint INTLIST;//從前向后顯示list隊列的全部元素
void put_list(INTLIST list, char *name)
{
INTLIST::iterator plist; cout "The contents of " name " : ";
for(plist = list.begin(); plist != list.end(); plist++)
cout *plist " ";
coutendl;
}//測試list容器的功能
void main(void)
{
//list1對象初始為空
INTLIST list1;
//list2對象最初有10個值為6的元素
INTLIST list2(10,6);
//list3對象最初有3個值為6的元素
INTLIST list3(list2.begin(),--list2.end()); //聲明一個名為i的雙向迭代器
INTLIST::iterator i; //從前向后顯示各list對象的元素
put_list(list1,"list1");
put_list(list2,"list2");
put_list(list3,"list3");
//從list1序列后面添加兩個元素
list1.push_back(2);
list1.push_back(4);
cout"list1.push_back(2) and list1.push_back(4):"endl;
put_list(list1,"list1");//從list1序列前面添加兩個元素
list1.push_front(5);
list1.push_front(7);
cout"list1.push_front(5) and list1.push_front(7):"endl;
put_list(list1,"list1");//在list1序列中間插入數據
list1.insert(++list1.begin(),3,9);
cout"list1.insert(list1.begin()+1,3,9):"endl;
put_list(list1,"list1");//測試引用類函數
cout"list1.front()="list1.front()endl;
cout"list1.back()="list1.back()endl;//從list1序列的前后各移去一個元素
list1.pop_front();
list1.pop_back();
cout"list1.pop_front() and list1.pop_back():"endl;
put_list(list1,"list1");//清除list1中的第2個元素
list1.erase(++list1.begin());
cout"list1.erase(++list1.begin()):"endl;
put_list(list1,"list1");//對list2賦值并顯示
list2.assign(8,1);
cout"list2.assign(8,1):"endl;
put_list(list2,"list2");//顯示序列的狀態信息
cout"list1.max_size(): "list1.max_size()endl;
cout"list1.size(): "list1.size()endl;
cout"list1.empty(): "list1.empty()endl;//list序列容器的運算
put_list(list1,"list1");
put_list(list3,"list3");
cout"list1list3: "(list1list3)endl;
cout"list1list3: "(list1list3)endl;//對list1容器排序
list1.sort();
put_list(list1,"list1");
//結合處理
list1.splice(++list1.begin(), list3);
put_list(list1,"list1");
put_list(list3,"list3");
}補充:STL標準函數find進行vector 、list鏈表查找#include vector
#include algorithm
#include iostreamclass example
{
public:
example(int val)
{
i = val;
}bool operator==(example const rhs)
{
return (i == rhs.i) ? true : false;
}private:
int i;
};
using namespace std;
int main(void)
{
vectorexample ve;
ve.push_back(1);
vectorexample::iterator it;
example elem(1);
it = find(ve.begin(), ve.end(), elem);
coutboolalpha(*it == elem);
}
網頁題目:c語言庫函數有list嗎 c語言所有庫函數
文章URL:http://vcdvsql.cn/article38/ddsiopp.html
成都網站建設公司_創新互聯,為您提供移動網站建設、微信小程序、、電子商務、品牌網站建設、做網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯