❶ C語言的源代碼是什麼意思啊
C語言源代碼,就是依據C語言規則所寫出的程序代碼,常見的存儲文件擴展名為.c文件和.h文件,分別對應C源文件(source file)和C頭文件(header file)。
C語言是一門編程語言,簡單點說,就是由人類書寫按照一定規范書寫的字元,通過一定手段(編譯鏈接)轉換後,可以讓電腦或者其它電子晶元"讀懂",並按照其要求工作的語言。
在所有的編程語言中,C語言是相對古老而原始的,同時也是在同類語言中更接近硬體,最為高效的編程語言。
(1)c語言工具類源碼擴展閱讀:
C語言廣泛應用於底層開發。它的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
它能提供了許多低級處理的功能,可以保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
❷ 有哪些優秀的 C/C++ 開源代碼框架這些框架的設計思路是怎樣的
框架我的理解就是用一套類庫搭建出程序的方式。比較有名的當然就是mfc,是微軟的。還有boland的vcl,不過好像已經賣給別的公司了。還有trolltech公司的qt,這個支持跨平台。
有了基礎還需要一個RAD(Rapid Application Development),比如vc,delphi。如果你是手機方面的開發root吧,如不是請參考下面的
C++通用框架和庫:
Apache C++ Standard Library:是一系列演算法,容器,迭代器和其他基本組件的集合
ASL :Adobe源代碼庫提供了同行的評審和可移植的C++源代碼庫。
Boost :大量通用C++庫的集合。
BDE :來自於彭博資訊實驗室的開發環境。
Cinder:提供專業品質創造性編碼的開源開發社區。
Cxxomfort:輕量級的,只包含頭文件的庫,將C++ 11的一些新特性移植到C++03中。
Dlib:使用契約式編程和現代C++科技設計的通用的跨平台的C++庫。
EASTL :EA-STL公共部分。
ffead-cpp :企業應用程序開發框架。
Folly:由Facebook開發和使用的開源C++庫。
JUCE :包羅萬象的C++類庫,用於開發跨平台軟體。
libPhenom:用於構建高性能和高度可擴展性系統的事件框架。
LibSourcey :用於實時的視頻流和高性能網路應用程序的C++11 evented IO。
LibU : C語言寫的多平台工具庫。
Loki :C++庫的設計,包括常見的設計模式和習語的實現。
MiLi :只含頭文件的小型C++庫。
openFrameworks :開發C++工具包,用於創意性編碼。
Qt :跨平台的應用程序和用戶界面框架。
Reason :跨平台的框架,使開發者能夠更容易地使用Java,.Net和Python,同時也滿足了他們對C++性能和優勢的需求。
ROOT :具備所有功能的一系列面向對象的框架,能夠非常高效地處理和分析大量的數據,為歐洲原子能研究機構所用。
STLport:是STL具有代表性的版本。
STXXL:用於額外的大型數據集的標准模板庫。
Ultimate++ :C++跨平台快速應用程序開發框架。
Windows Template Library:用於開發Windows應用程序和UI組件的C++庫。
Yomm11 :C++11的開放multi-methods。
❸ 源碼(最原始程式的代碼)詳細資料大全
源碼就是鍵簡指編寫的最原始程式的代碼。運行的軟體是要經過編寫的,程式設計師編寫程式的過程中需要他們的「語言」。音樂家用五線譜和音符,建築師用圖紙和筆,那程式設計師的工作的語言就是「源碼」了。
人們平時使用軟體時就是程式把「源碼」翻譯成我們可直觀的形式表現出來供我們使用的。
任何一個網站螞廳頁面,換成源碼就是一堆按一定格式書寫的文字和符號,但我們的瀏覽器幫我們翻譯成眼前的模樣了。
❹ c語言表白程序源代碼
你需要的是編譯器,比如TurboC,MSC,或者VC等等,你寫的C代碼只是源程序而已,需要經過C編譯器編譯成可執行的EXE文件。C編譯器有很多,上面提到的就是比較常用的,至於編譯器的使用,你得另查一查使用手冊,一般而言,編譯器都帶有IDE的集成編程環境,可以作為程序的編輯器(別把編輯器和編譯器弄混了,編輯器就是可以輸入源代碼的軟體工具,如記事本就是一個最簡單的編輯器,編譯器就是用於編譯特定語言源代碼的軟體),然後一般都有一個編譯(Compile)按鈕(或者編譯命令),編譯時編譯器會檢查你的源代碼是否有語法錯誤,如果沒有錯誤,還會使用鏈接(Link)工具將你的程序鏈接成為可執行的Exe文件,至此,你的源程序就成了可運行的程序了。運行EXE文件是不用源代碼的,它與編寫程序的語言無關,各種編程語言寫成的源程序經過該編程語言的編譯器可以被編譯成在計算機上可以被運行的執行程序。
❺ 請問C語言中源代碼是什麼意思啊
代碼就是源程序
源代碼,是指未編譯的文本代碼。是一系列人類可讀的計算機語言指令。
在現代程序語言中,源代碼可以是以書籍或者磁帶的形式出現,但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼的最終目的是將人類可讀的文本翻譯成為計算機可以執行的二進制指令,這種過程叫做編譯,通過編譯器完成。
作用
源代碼主要功用有如下2種作用:
生成目標代碼,即計算機可以識別的代碼。
對軟體進行說明,即對軟體的編寫進行說明。為數不少的初學者,甚至少數有經驗的程序員都忽視軟體說明的編寫,因為這部分雖然不會在生成的程序中直接顯示,也不參與編譯。但是說明對軟體的學習、分享、維護和軟體復用都有巨大的好處。因此,書寫軟體說明在業界被認為是能創造優秀程序的良好習慣,一些公司也硬性規定必須書寫。
需要指出的是,源代碼的修改不能改變已經生成的目標代碼。如果需要目標代碼做出相應的修改,必須重新編譯。
代碼組合
源代碼作為軟體的特殊部分,可能被包含在一個或多個文件中。一個程序不必用同一種格式的源代碼書寫。例如,一個程序如果有C語言庫的支持,那麼就可以用C語言;而另一部分為了達到比較高的運行效率,則可以用匯編語言編寫。
較為復雜的軟體,一般需要數十種甚至上百種的源代碼的參與。為了降低種復雜度,必須引入一種可以描述各個源代碼之間聯系,並且如何正確編譯的系統。在這樣的背景下,修訂控制系統(RCS)誕生了,並成為研發者對代碼修訂的必備工具之一。
還有另外一種組合:源代碼的編寫和編譯分別在不同的平台上實現,專業術語叫做軟體移植。
版權
如果按照源代碼類型區分軟體,通常被分為兩類:自由軟體和非自由軟體。自由軟體一般是不僅可以免費得到,而且公開源代碼;相對應地,非自由軟體則是不公開源代碼。所有一切通過非正常手段獲得非自由軟體源代碼的行為都將被視為非法。
質量
對於計算機而言,並不存在真正意義上的「好」的源代碼;然而作為一個人,好的書寫習慣將決定源代碼的好壞。源代碼是否具有可讀性,成為好壞的重要標准。軟體文檔則是表明可讀性的關鍵。
效率
雖然我們可以通過不同的語言來實現計算機的同一功能,但在執行效率上則存在不同。普遍規律是:越高級的語言,其執行效率越低。這也是為什麼匯編語言生成的文件比用VB語言生成文件普遍要小的原因。
❻ C語言,C語言源代碼到底是什麼意思
現在的教學流程有問題
要是我肯定先拿一個可以正常運行的helloworld來一邊改
一邊講解
然後寫個猜數字控制台程序
接下來用MFC給他寫個界面
讓大家知道學習這些演算法到底有什麼用
再往後,我可能會一直教界面編程
直到你們感覺到自己的演算法需要深入學習
然後再回過頭去學演算法
別用什麼垃圾TC了,這都什麼年代了
新手建議VC6即可,又可以學演算法
也能開發MFC界面程序對電腦配置要求也不搞
甚至綠色精簡版就能用
然後寫一些游戲相關的工具或者網路相關的工具
不怕不懂,這樣至少知道缺什麼知識,然後去學
我最討厭學一大堆,也不知道有什麼用的
提不起興趣,也沒有積極主動性
我寫的網游伺服器在線人數實時顯示。。。。
還有游戲輔助沒寫完 這里不能上圖了,要是上那個估計會被刪除回答
❼ c語言數據結構(考題,測試你的能力)--編寫源代碼
P88 稀疏矩陣十字鏈表相加演算法如下:
/*假設ha為A稀疏矩陣十字鏈表的頭指針,hb為B稀疏矩陣十字鏈表的頭指針*/
#include<stdio.h>
#define maxsize 100
struct linknode
{ int i,j;
struct linknode *cptr,*rptr;
union vnext
{ int v;
struct linknode *next;} k;
};
struct linknode creatlindmat( ) /*建立十字鏈表*/
{ int x, m, n, t, s, i, j, k;
struct linknode *p , *q, *cp[maxsize],*hm;
printf("請輸入稀疏矩陣的行、列數及非零元個數\n");
scanf("%d%d%d",&m,&n,&t);
if (m>n) s=m; else s=n;
hm=(struct linknode*)malloc(sizeof(struct linknode)) ;
hm->i=m; hm->j=n;
cp[0]=hm;
for (i=1; i<=s;i++)
{ p=(struct linknode*)malloc(sizeof(struct linknode)) ;
p->i=0; p->j=0;
p->rptr=p; p->cptr=p;
cp[i]=p;
cp[i-1]->k.next=p;
}
cp[s]->k.next=hm;
for( x=1;x<=t;x++)
{ printf("請輸入一個三元組(i,j,v)\n");
scanf("%d%d%d",&i,&j,&k);
p=(struct linknode*)malloc(sizeof(struct linknode));
p->i=i; p->j=j; p->k.v=k;
/*以下是將p插入到第i行鏈表中 */
q=cp[i];
while ((q->rptr!=cp[i]) &&( q->rptr->j<j))
q=q->rptr;
p->rptr=q->rptr;
q->rptr=p;
/*以下是將P插入到第j列鏈表中*/
q=cp[j];
while((q->cptr!=cp[j]) &&( q->cptr->i<i))
q=q->cptr;
p->cptr=q->cptr;
q->cptr=p;
}
return hm;
}
/* ha和hb表示的兩個稀疏矩陣相加,相加的結果放入ha中*/
struct linknode *matadd(struct linknode *ha, struct linknode *hb)
{ struct linknode *pa, *pb, *qa, *ca,*cb,*p,*q;
struct linknode *hl[maxsize];
int i , j, n;
if((ha->i!=hb->i)||(ha->j!=hb->j))
printf("矩陣不匹配,不能相加\n");
else
{ p=ha->k.next; n=ha->j;
for (i=1;i<=n; i++)
{ hl[i]=p;
p=p->k.next;
}
ca=ha->k.next; cb=hb->k.next;
while(ca->i==0)
{pa=ca->rptr; pb=cb->rptr;
qa=ca;
while(pb->j!=0)
{ if((pa->j<pb->j)&&(pa->j!=0))
{ qa=pa; pa=pa->rptr;}
else if ((pa->j>pb->j)||(pa->j==0)) /*插入一個結點*/
{ p=(struct linknode*)malloc(sizeof(struct linknode));
p->i=pb->i; p->j=pb->j;
p->k.v=pb->k.v;
qa->rptr=p; p->rptr=pa;
qa=p; pb=pb->rptr;
j=p->j; q=hl[j]->cptr;
while((q->i<p->i)&&(q->i!=0))
{ hl[j]=q; q=hl[j]->cptr;}
hl[j]->cptr=p; p->cptr=q;
hl[j]=p;
}
else
{pa->k.v=pa->k.v+pb->k.v;
if(pa->k.v==0) /*刪除一個結點*/
{ qa->rptr=pa->rptr;
j=pa->j; q=hl[j]->cptr;
while (q->i<pa->i)
{hl[j]=q; q=hl[j]->cptr;}
hl[j]->cptr=q->cptr;
pa=pa->rptr; pb=pb->rptr;
free(q);
}
else
{ qa=pa; pa=pa->rptr;
pb=pb->rptr;
}
}
}
ca=ca->k.next; cb=cb->k.next;
}
}
return ha;
}
void print(struct linknode *ha) /*輸出十字鏈表*/
{ struct linknode *p,*q;
p=ha->k.next;
while(p->k.next!=ha)
{ q=p->rptr;
while(q->rptr!=p)
{ printf("%3d%3d%3d\t",q->i,q->j,q->k.v);
q=q->rptr;
}
if(p!=q)
printf("%3d%3d%3d",q->i,q->j,q->k.v);
printf("\n");
p=p->k.next;
}
q=p->rptr;
while(q->rptr!=p)
{ printf("%3d%3d%3d\t",q->i,q->j,q->k.v);
q=q->rptr;
}
if(p!=q)
printf("%3d%3d%3d",q->i,q->j,q->k.v);
printf("\n");
}
void main()
{
struct linknode *ha=NULL,*hb=NULL,*hc=NULL;
ha=creatlindmat( ); /*生成一個十字鏈表ha*/
hb=creatlindmat( ); /*生成另一個十字鏈表hb*/
printf("A:\n"); /*輸出十字鏈表ha*/
print(ha);printf("\n");
printf("B:\n"); /*輸出十字鏈表hb*/
print(hb);printf("\n");
hc=matadd(ha,hb); /*十字鏈表相加*/
printf("A+B:\n"); /*輸出相加後的結果*/
print(hc);printf("\n");
}
P94 數據類型描述如下:
#define elemtype char
struct node1
{ int atom;
struct node1 *link;
union
{
struct node1 *slink;
elemtype data;
} ds;
}
P95 數據類型描述如下:
struct node2
{ elemtype data;
struct node2 *link1,*link2;
}
P96 求廣義表的深度depth(LS)
int depth(struct node1 *LS)
{
int max=0,dep;
while(LS!=NULL)
{ if(LS->atom==0) //有子表
{ dep=depth(LS->ds.slink);
if(dep>max) max=dep;
}
LS=LS->link;
}
return max+1;
}
P96 廣義表的建立creat(LS)
void creat(struct node1 *LS)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
LS=NULL;
else if(ch=='(')
{LS=(struct node*)malloc(sizeof(struct node));
LS->atom=0;
creat(LS->ds.slink);
}
else
{ LS=(struct node*)malloc(sizeof(struct node));
LS->atom=1;
LS->ds.data=ch;
}
scanf("%c",&ch);
if(LS==NULL);
else if(ch==',')
creat(LS->link);
else if((ch==')')||(ch==';'))
LS->link=NULL;
}
P97 輸出廣義表print(LS)
void print(struct node1 *LS)
{
if(LS->atom==0)
{
printf("(");
if(LS->ds.slink==NULL)
printf("#");
else
print(LS->ds.slink);
}
else
printf("%c ",LS->ds.data);
if(LS->atom==0)
printf(")");
if(LS->link!=NULL)
{
printf(";");
print(LS->link);
}
}
P98 該演算法的時間復雜度為O(n)。整個完整程序如下:
#include<stdio.h>
#define elemtype char
struct node1
{ int atom;
struct node1 *link;
union
{
struct node1 *slink;
elemtype data;
} ds;
};
void creat(struct node1 LS) /*建立廣義表的單鏈表*/
{
char ch;
scanf("%c",&ch);
if(ch=='#')
LS=NULL;
else if(ch=='(')
{LS=(struct node1*)malloc(sizeof(struct node1));
LS->atom=0;
creat(LS->ds.slink);
}
else
{ LS=(struct node1*)malloc(sizeof(struct node1));
LS->atom=1;
LS->ds.data=ch;
}
scanf("%c",&ch);
if(LS==NULL);
else if(ch==',')
creat(LS->link);
else if((ch==')')||(ch==';'))
LS->link=NULL;
}
void print(struct node1 LS) /*輸出廣義單鏈表*/
{
if(LS->atom==0)
{
printf("(");
if(LS->ds.slink==NULL)
printf("#");
else
print(LS->ds.slink);
}
else
printf("%c",LS->ds.data);
if(LS->atom==0)
printf(")");
if(LS->link!=NULL)
{
printf(";");
print(LS->link);
}
}
int depth(struct node1 LS) /*求廣義表的深度*/
{
int max=0;
while(LS!=NULL)
{ if(LS->atom==0)
{ int dep=depth(LS->ds.slink);
if(dep>max) max=dep;
}
LS=LS->link;
}
return max+1;
}
main()
{ int dep;
struct node1 *p=NULL;
creat(p); /*建立廣義表的單鏈表*/
print(p); /*輸出廣義單鏈表*/
dep=depth(p); /*求廣義表的深度*/
printf("%d\n",dep);
}
第六章 樹
P109 二叉鏈表的結點類型定義如下:
typedef struct btnode
{ anytype data;
struct btnode *Lch,*Rch;
}tnodetype;
P109 三叉鏈表的結點類型定義如下:
typedef struct btnode3
{ anytype data;
struct btnode *Lch,*Rch,*Parent ;
}tnodetype3;
P112 C語言的先序遍歷演算法:
void preorder (tnodetype *t)
/*先序遍歷二叉樹演算法,t為指向根結點的指針*/
{ if (t!=NULL)
{printf("%d ",t->data);
preorder(t->lch);
preorder(t->rch);
}
}
P113 C語言的中序遍歷演算法:
void inorder(tnodetype *t)
/*中序遍歷二叉樹演算法,t為指向根結點的指針*/
{
if(t!=NULL)
{inorder(t->lch);
printf("%d ",t->data);
inorder(t->rch);
}
}
P113 C語言的後序遍歷演算法:
void postorder(tnodetype *t)
/*後序遍歷二叉樹演算法,t為指向根結點的指針*/
{
if(t!=NULL)
{ postorder(t->lch);
postorder(t->rch);
printf("%d ",t->data);
}
}
P114 如果引入隊列作為輔助存儲工具,按層次遍歷二叉樹的演算法可描述如下:
void levelorder(tnodetype *t)
/*按層次遍歷二叉樹演算法,t為指向根結點的指針*/
{tnodetype q[20]; /*輔助隊列*/
front=0;
rear=0; /*置空隊列*/
if (t!=NULL)
{ rear++;
q[rear]=t; /*根結點入隊*/
}
while (front!=rear)
{ front++;
t=q [front];
printf ("%c\n",t->data);
if (t->lch!=NULL) /*t的左孩子不空,則入隊*/
{ rear++;
q [rear]=t->lch;
}
if (t->rch!=NULL) /*t的右孩子不空,則入隊*/
{ rear++;
q [rear]=t->rch;
}
}
}
P115 以中序遍歷的方法統計二叉樹中的結點數和葉子結點數,演算法描述為:
void inordercount (tnodetype *t)
/*中序遍歷二叉樹,統計樹中的結點數和葉子結點數*/
{ if (t!=NULL)
{ inordercount (t->lch); /*中序遍歷左子樹*/
printf ("%c\n",t->data); /*訪問根結點*/
countnode++; /*結點計數*/
if ((t->lch==NULL)&&(t->rch==NULL))
countleaf++; /*葉子結點計數*/
inordercount (t->rch); /*中序遍歷右子樹*/
}
}
P115 可按如下方法計算一棵二叉樹的深度:
void preorderdeep (tnodetype *t,int j)
/*先序遍歷二叉樹,並計算二叉樹的深度*/
{ if (t!=NULL)
{ printf ("%c\n",t->data); /*訪問根結點*/
j++;
if (k<j) k=j;
preorderdeep (t->lch,j); /*先序遍歷左子樹*/
preorderdeep (t->rch,j); /*先序遍歷右子樹*/
}
}
P117 線索二叉樹的結點類型定義如下:
struct nodexs
{anytype data;
struct nodexs *lch, *rch;
int ltag,rtag; /*左、右標志域*/
}
P117 中序次序線索化演算法
void inorderxs (struct nodexs *t)
/*中序遍歷t所指向的二叉樹,並為結點建立線索*/
{ if (t!=NULL)
{ inorderxs (t->lch);
printf ("%c\n",t->data);
if (t->lch!=NULL)
t->ltag=0;
else { t->ltag=1;
t->lch=pr;
} /*建立t所指向結點的左線索,令其指向前驅結點pr*/
if (pr!=NULL)
{ if (pr->rch!=NULL)
pr->rtag=0;
else { pr->rtag=1;
pr->rch=p;
}
} /*建立pr所指向結點的右線索,令其指向後繼結點p*/
pr=p;
inorderxs (t->rch);
}
}
P118 在中根線索樹上檢索某結點的前驅結點的演算法描述如下:
struct nodexs * inpre (struct nodexs *q)
/*在中根線索樹上檢索q所指向的結點的前驅結點*/
{ if (q->ltag==1)
p=q->lch;
else { r=q->lch;
while (r->rtag!=1)
r=r->rch;
p=r;
}
return (p);
}
P119 在中根線索樹上檢索某結點的後繼結點的演算法描述如下:
struct nodexs * insucc (struct nodexs *q)
/*在中根線索樹上檢索q所指向的結點的後繼結點*/
{ if (q->rtag==1)
p=q->rch;
else { r=q->rch;
while (r->ltag!=1)
r=r->lch;
p=r;
}
return (p);
}
P120 演算法程序用C語言描述如下:
void sortBT(BT *t,BT *s) /*將指針s所指的結點插入到以t為根指針的二叉樹中*/
{ if (t==NULL) t=s; /*若t所指為空樹,s所指結點為根*/
else if (s->data < t->data)
sortBT(t->lch,s); /*s結點插入到t的左子樹上去*/
else
sortBT(t->rch,s); /*s結點插入到t的右子樹上去*/
}
P121 二叉排序樹結點刪除演算法的C語言描述如下:
void delnode(bt,f,p)
/*bt為一棵二叉排序樹的根指針,p指向被刪除結點,f指向其雙親*/
/*當p=bt時f為NULL*/
{ fag=0; /*fag=0時需修改f指針信息,fag=1時不需修改*/
if (p->lch==NULL)
s=p->rch; /*被刪除結點為葉子或其左子樹為空*/
else if (p->rch==NULL)
s=p->lch;
else { q=p; /*被刪除結點的左、右子樹均非空*/
s=p->lch;
while (s->rch!=NULL)
{ q=s;
s=s->rch;
} /*尋找s結點*/
if (q=p)
q->lch=s->lch;
else q->rch=s->lch;
p->data=s->data; /*s所指向的結點代替被刪除結點*/
DISPOSE(s);
Fag=1;
}
if (fag=0) /*需要修改雙親指針*/
{ if (f=NULL)
bt=s; /*被刪除結點為根結點*/
else if (f->lch=p)
f->lch=s;
else f->rch=s;
DISPOSE(p); /*釋放被刪除結點*/
}
}
第七章 圖
P134 用鄰接矩陣表示法表示圖,除了存儲用於表示頂點間相鄰關系的鄰接矩陣外,通常還需要用一個順序表來存儲頂點信息。其形式說明如下:
# define n 6 /*圖的頂點數*/
# define e 8 /*圖的邊(弧)數*/
typedef char vextype; /*頂點的數據類型*/
typedef float adjtype; /*權值類型*/
typedef struct
{vextype vexs[n];
adjtype arcs[n][n];
}graph;
P135 建立一個無向網路的演算法。
CREATGRAPH(ga) /*建立無向網路*/
Graph * ga;
{
int i,j,k;
float w;
for(i=0;i<n;i++ )
ga ->vexs[i]=getchar(); /*讀入頂點信息,建立頂點表*/
for(i=0;i<n;i++ )
for(j=0;j<n;j++)
ga ->arcs[i][j]=0; /*鄰接矩陣初始化*/
for(k=0;k<e;k++) /*讀入e條邊*/
(scanf("%d%d%f",&I,&j,&w); /*讀入邊(vi,vj)上的權w */
ga ->arcs[i][j]=w;
ga - >arcs[j][i]=w;
}
} /*CREATGRAPH*/
P136 鄰接表的形式說明及其建立演算法:
typedef struct node
{int adjvex; /*鄰接點域*/
struct node * next; /*鏈域*/
}edgenode; /*邊表結點*/
typedef struct
{vextype vertex; /*頂點信息*/
edgenode link; /*邊表頭指針*/
}vexnode; /*頂點表結點*/
vexnode ga[n];
CREATADJLIST(ga) /*建立無向圖的鄰接表*/
Vexnode ga[ ];
{int i,j,k;
edgenode * s;
for(i=o;i<n;i++= /*讀入頂點信息*/
(ga[i].vertex=getchar();
ga[i].1ink=NULL; /*邊表頭指針初始化*/
}
for(k=0;k<e;k++= /*建立邊表*/
{scanf("%d%d",&i,&j); /*讀入邊(vi , vj)的頂點對序號*/
s=malloc(sizeof(edgenode)); /*生成鄰接點序號為j的表結點*s */
s-> adjvex=j;
s- - >next:=ga[i].Link;
ga[i].1ink=s; /*將*s插入頂點vi的邊表頭部*/
s=malloc(size0f(edgende)); /*生成鄰接點序號為i的邊表結點*s */
s ->adjvex=i;
s ->next=ga[j].1ink;
ga[j].1ink=s; /*將*s插入頂點vj的邊表頭部*/
}
} /* CREATADJLIST */
P139 分別以鄰接矩陣和鄰接表作為圖的存儲結構給出具體演算法,演算法中g、g1和visited為全程量,visited的各分量初始值均為FALSE。
int visited[n] /*定義布爾向量visitd為全程量*/
Graph g; /*圖g為全程量*/
DFS(i) /*從Vi+1出發深度優先搜索圖g,g用鄰接矩陣表示*/
int i;
{ int j;
printf("node:%c\n" , g.vexs[i]); /*訪問出發點vi+1 */
Visited[i]=TRUE; /*標記vi+l已訪問過*/
for (j=0;j<n;j++) /*依次搜索vi+1的鄰接點*/
if((g.arcs[i][j]==1) &&(! visited[j]))
DFS(j); /*若Vi+l的鄰接點vj+l未曾訪問過,則從vj+l出發進行深度優先搜索*/
} /*DFS*/
vexnode gl[n] /*鄰接表全程量*/
DFSL(i) /*從vi+l出發深度優先搜索圖g1,g1用鄰接表表示*/
int i;
{ int j;
edgenode * p;
printf("node:%C\n" ,g1[i].vertex);
vistited[i]=TRUE;
p=g1[i].1ink; /*取vi+1的邊表頭指針*/
while(p !=NULL) /*依次搜索vi+l的鄰接點*/
{
if(! Vistited[p ->adjvex])
DFSL(p - >adjvex); /*從vi+1的未曾訪問過的鄰接點出發進行深度優先搜索*/
p=p - >next; /*找vi+l的下一個鄰接點*/
}
} /* DFSL */
P142 以鄰接矩陣和鄰接表作為圖的存儲結構,分別給出寬度優先搜索演算法。
BFS(k) /*從vk+l出發寬度優先搜索圖g,g用鄰接矩陣表示,visited為訪問標志向量*/
int k;
{ int i,j;
SETNULL(Q); /*置空隊Q */
printf("%c\n",g.vexs[k]); /*訪問出發點vk+l*x/
visited[k]=TRUE; /*標記vk+l已訪問過*/
ENQUEUE(Q,K); /*已訪問過的頂點(序號)入隊列*/
While(!EMPTY(Q)) /*隊非空時執行*/
{i=DEQUEUE(Q); /*隊頭元素序號出隊列*/
for(j=0;j<n;j++)
if((g.arcs[i][j]==1)&&(! visited[j]))
{printf("%c\n" , g.vexs[j]); /*訪問vi+l的未曾訪問的鄰接點vj+l */
visited[j]=TRUE;
ENQUEUE(Q,j); /*訪問過的頂點入隊*/
}
}
} /* BFS */
BFSL(k) /*從vk+l出發寬度優先搜索圖g1,g1用鄰接表表示*/
int k
{ int i;
edgenode * p;
SETNULL(Q);
printf("%c\n" , g1[k].vertex);
visited[k]=TRUE;
ENQUEUE(Q,k);
while(! EMPTY(Q));
{ i=DEQUEUE(Q);
p=g1[i].1ink /*取vi+l的邊表頭指針*/
while(p !=NULL) /*依次搜索vi+l的鄰接點*/
{ if( ! visited[p - >adjvex]) /*訪問vi+l的未訪問的鄰接點*/
{ printf{"%c\n" , g1[p - >adjvex].vertex};
visited[p - >adjvex]=TRUE;
ENQUEUE(Q,p - >adjvex); /*訪問過的頂點入隊*/
}
p=p - >next; /*找vi+l的下一個鄰接點*/
}
}
} /*BFSL*/
P148 在對演算法Prim求精之前,先確定有關的存儲結構如下:
typdef struct
{Int fromvex,endvex; /*邊的起點和終點*/
float length; /*邊的權值*/
} edge;
float dist[n][n]; /*連通網路的帶權鄰接矩陣*/
edgeT[n-1]; /*生成樹*/
P149 抽象語句(1)可求精為:
for(j=1;j<n;j++) /*對n-1個藍點構造候選紫邊集*/
{T[j-1].fromvex=1}; /*紫邊的起點為紅點*/
T[j-1].endvex=j+1; /*紫邊的終點為藍點*/
T[j-1].1ength=dist[0][j]; /*紫邊長度*/
}
P149 抽象語句(3)所求的第k條最短紫邊可求精為:
min=max; /*znax大於任何邊上的權值*/
for (j=k;j<n-1;j++) /*掃描當前候選紫邊集T[k]到T[n-2],找最短紫邊*/
if(T[j].1ength<min)
{min=T[j].1ength;m=j; /*記錄當前最短紫邊的位置*/
}
P149 抽象語句(4)的求精:
e=T[m];T[m]=T[k];T[k]=e, /* T[k]和T[m]交換*/
v=T[kl.Endvex]; /* v是剛被塗紅色的頂點*/
P149 抽象語句(5)可求精為:
for(j=k+1;j<n-1;j++) /*調整候選紫邊集T[k+1]到T[n-2]*/
{d=dist[v-1][T[j].endvex-1]; /*新紫邊的長度*/
if(d<T[j].1ength) /*新紫邊的長度小於原最短紫邊*/
{T[j].1ength=d;
T[j].fromvex=v; /*新紫邊取代原最短紫邊*/
}
}
P150 完整的演算法:
PRIM() /*從第一個頂點出發構造連通網路dist的最小生成樹,結果放在T中*/
{int j , k , m , v , min , max=l0000;
float d;
edge e;
for(j=1;j<n;j++) /*構造初始候選紫邊集*/
{T[j-1].formvex=1; /*頂點1是第一個加入樹中的紅點*/
T[j-1].endvex=j+1;
T[j-1].length=dist[o][j];
}
for(k=0;k<n-1;k++) /*求第k條邊*/
{min=max;
for(j=k;j<n-1;j++) /*在候選紫邊集中找最短紫邊*/
if(T[j].1ength<min)
{min=T[j].1ength;
m=j;
} /*T[m]是當前最短紫邊*/
}
e=T[m];T[m]=T[k];T[k]=e; /*T[k]和T[m]交換後,T[k]是第k條紅色樹邊*/
v=T[k].endvex ; /* v是新紅點*/
for(j=k+1;j<n-1;j++) /*調整候選紫邊集*/
{d=dist[v-1][T[j].endvex-1];
if(d<T[j].1ength);
{T[j].1ength=d;
T[j].fromvex=v;
}
}
} /* PRIM */
P151 Kruskl演算法的粗略描述:
T=(V,φ);
While(T中所含邊數<n-1)
{從E中選取當前最短邊(u,v);
從E中刪去邊(u,v);
if((u,v)並入T之後不產生迴路,將邊(u,v)並入T中;
}
P153 迪傑斯特拉演算法實現。演算法描述如下:
#define max 32767 /*max代表一個很大的數*/
void dijkstra (float cost[][n],int v)
/*求源點v到其餘頂點的最短路徑及其長度*/
{ v1=v-1;
for (i=0;i<n;i++)
{ dist[i]=cost[v1][i]; /*初始化dist*/
if (dist[i]<max)
pre[i]=v;
else pre[i]=0;
}
pre[v1]=0;
for (i=0;i<n;i++)
s[i]=0; /*s數組初始化為空*/
s[v1]=1; /*將源點v歸入s集合*/
for (i=0;i<n;i++)
{ min=max;
for (j=0;j<n;j++)
if (!s[j] && (dist[j]<min))
{ min=dist[j];
k=j;
} /*選擇dist值最小的頂點k+1*/
s[k]=1; /*將頂點k+1歸入s集合中*/
for (j=0;j<n;j++)
if (!s[j]&&(dist[j]>dist[k]+cost[k][j]))
{ dist[j]=dist[k]+cost[k][j]; /*修改 V-S集合中各頂點的dist值*/
pre[j]=k+1; /*k+1頂點是j+1頂點的前驅*/
}
} /*所有頂點均已加入到S集合中*/
for (j=0;j<n;j++) /*列印結果*/
{ printf("%f\n%d",dist[j],j+1;);
p=pre[j];
while (p!=0)
{ printf("%d",p);
p=pre[p-1];
}
}
}
P155 弗洛伊德演算法可以描述為:
A(0)[i][j]=cost[i][j]; //cost為圖的鄰接矩陣
A(k)[i][j]=min{A(k-1) [i][j],A(k-1) [i][k]+A(k-1) [k][j]}
其中 k=1,2,…,n
P155 弗洛伊德演算法實現。演算法描述如下:
int path[n][n]; /*路徑矩陣*/
void floyd (float A[][n],cost[][n])
{ for (i=0;i<n;i++) /*設置A和path的初值*/
for (j=0;j<n;j++)
{ if (cost[i][j]<max)
path[i][j]=j;
else { path[i][j]=0;
A[i][j]=cost[i][j];
}
}
for (k=0;k<n;k++)
/*做n次迭代,每次均試圖將頂點k擴充到當前求得的從i到j的最短路徑上*/
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (A[i][j]>(A[i][k]+A[k]
❽ 吐血整理:C++編程語言資源匯總
關於 C++ 框架、庫和資源的一些匯總列表,內容包括:標准庫、Web應用框架、人工智慧、資料庫、圖片處理、機器學習、日誌、代碼分析等。有需要的小夥伴可以收藏一下!
C++標准庫,包括了STL容器,演算法和函數等。
C++ Standard Library:是一系列類和函數的集合,使用核心語言編寫,也是C++ISO自身標準的一部分。
Standard Template Library:標准模板庫
C POSIX library : POSIX系統的C標准庫規范
ISO C++ Standards Committee :C++標准委員會
C++通用框架和庫
Apache C++ Standard Library:是一系列演算法,容器,迭代器和其他基本組件的集合
ASL :Adobe源代碼庫提供了同行的評審和可移植的C++源代碼庫。
Boost :大量通用C++庫的集合。
BDE :來自於彭博資訊實驗室的開發環境。
Cinder:提供專業品質創造性編碼的開源開發社區。
Cxxomfort:輕量級的,只包含頭文件的庫,將C++ 11的一些新特性移植到C++03中。
Dlib:使用契約式編程和現代C++ 科技 設計的通用的跨平台的C++庫。
EASTL :EA-STL公共部分
ffead-cpp :企業應用程序開發框架
Folly:由Facebook開發和使用的開源C++庫
JUCE :包羅萬象的C++類庫,用於開發跨平台軟體
libPhenom:用於構建高性能和高度可擴展性系統的事件框架。
LibSourcey :用於實時的視頻流和高性能網路應用程序的C++11 evented IO
LibU : C語言寫的多平台工具庫
Loki :C++庫的設計,包括常見的設計模式和習語的實現。
MiLi :只含頭文件的小型C++庫
openFrameworks :開發C++工具包,用於創意性編碼。
Qt :跨平台的應用程序和用戶界面框架
Reason :跨平台的框架,使開發者能夠更容易地使用Java,.Net和Python,同時也滿足了他們對C++性能和優勢的需求。
ROOT :具備所有功能的一系列面向對象的框架,能夠非常高效地處理和分析大量的數據,為歐洲原子能研究機構所用。
STLport:是STL具有代表性的版本
STXXL:用於額外的大型數據集的標准模板庫。
Ultimate++ :C++跨平台快速應用程序開發框架
Windows Template Library:用於開發Windows應用程序和UI組件的C++庫
Yomm11 :C++11的開放multi-methods.
btsk : 游戲 行為樹啟動器工具
Evolving Objects:基於模板的,ANSI C++演化計算庫,能夠幫助你非常快速地編寫出自己的隨機優化演算法。
Neu:C++11框架,編程語言集,用於創建人工智慧應用程序的多用途軟體系統。
Boost.Asio:用於網路和底層I/O編程的跨平台的C++庫。
libev :功能齊全,高性能的時間循環,輕微地仿效libevent,但是不再像libevent一樣有局限性,也修復了它的一些bug。
libevent :事件通知庫
libuv :跨平台非同步I/O。
音頻,聲音,音樂,數字化音樂庫
FMOD :易於使用的跨平台的音頻引擎和音頻內容的 游戲 創作工具。
Maximilian :C++音頻和音樂數字信號處理庫
OpenAL :開源音頻庫—跨平台的音頻API
Opus:一個完全開放的,免版稅的,高度通用的音頻編解碼器
Speex:免費編解碼器,為Opus所廢棄
Tonic: C++易用和高效的音頻合成
Vorbis: Ogg Vorbis是一種完全開放的,非專有的,免版稅的通用壓縮音頻格式。
生物信息,基因組學和生物技術
libsequence:用於表示和分析群體遺傳學數據的C++庫。
SeqAn:專注於生物數據序列分析的演算法和數據結構。
Vcflib :用於解析和處理VCF文件的C++庫
Wham:直接把聯想測試應用到BAM文件的基因結構變異。
壓縮和歸檔庫
bzip2:一個完全免費,免費專利和高質量的數據壓縮
doboz:能夠快速解壓縮的壓縮庫
PhysicsFS:對各種歸檔提供抽象訪問的庫,主要用於視頻 游戲 ,設計靈感部分來自於Quake3的文件子系統。
KArchive:用於創建,讀寫和操作文件檔案(例如zip和 tar)的庫,它通過QIODevice的一系列子類,使用gzip格式,提供了透明的壓縮和解壓縮的數據。
LZ4 :非常快速的壓縮演算法
LZHAM :無損壓縮資料庫,壓縮比率跟LZMA接近,但是解壓縮速度卻要快得多。
LZMA :7z格式默認和通用的壓縮方法。
LZMAT :及其快速的實時無損數據壓縮庫
miniz:單一的C源文件,緊縮/膨脹壓縮庫,使用zlib兼容API,ZIP歸檔讀寫,PNG寫方式。
Minizip:Zlib最新bug修復,支持PKWARE磁碟跨越,AES加密和IO緩沖。
Snappy :快速壓縮和解壓縮
ZLib :非常緊湊的數據流壓縮庫
ZZIPlib:提供ZIP歸檔的讀許可權。
並發執行和多線程
Boost.Compute :用於OpenCL的C++GPU計算庫
Bolt :針對GPU進行優化的C++模板庫
C++React :用於C++11的反應性編程庫
Intel TBB :Intel線程構件塊
Libclsph:基於OpenCL的GPU加速SPH流體模擬庫
OpenCL :並行編程的異構系統的開放標准
OpenMP:OpenMP API
Thrust :類似於C++標准模板庫的並行演算法庫
HPX :用於任何規模的並行和分布式應用程序的通用C++運行時系統
VexCL :用於OpenCL/CUDA 的C++向量表達式模板庫。
C++ B-tree :基於B樹數據結構,實現命令內存容器的模板庫
Hashmaps: C++中開放定址哈希表演算法的實現
Bcrypt :一個跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系統和處理器中。
BeeCrypt:
Botan: C++加密庫
Crypto++:一個有關加密方案的免費的C++庫
GnuPG: OpenPGP標準的完整實現
GnuTLS :實現了SSL,TLS和DTLS協議的安全通信庫
Libgcrypt
libmcrypt
LibreSSL:免費的SSL/TLS協議,屬於2014 OpenSSL的一個分支
LibTomCrypt:一個非常全面的,模塊化的,可移植的加密工具
libsodium:基於NaCI的加密庫,固執己見,容易使用
Nettle 底層的加密庫
OpenSSL : 一個強大的,商用的,功能齊全的,開放源代碼的加密庫。
Tiny AES128 in C :用C實現的一個小巧,可移植的實現了AES128ESB的加密演算法
資料庫,SQL伺服器,ODBC驅動程序和工具
hiberlite :用於Sqlite3的C++對象關系映射
Hiredis: 用於Redis資料庫的很簡單的C客戶端庫
LevelDB: 快速鍵值存儲庫
LMDB:符合資料庫四大基本元素的嵌入鍵值存儲
MySQL++:封裝了MySql的C API的C++ 包裝器
RocksDB:來自Facebook的嵌入鍵值的快速存儲
SQLite:一個完全嵌入式的,功能齊全的關系資料庫,只有幾百KB,可以正確包含到你的項目中。
調試庫, 內存和資源泄露檢測,單元測試
Boost.Test:Boost測試庫
Catch:一個很 時尚 的,C++原生的框架,只包含頭文件,用於單元測試,測試驅動開發和行為驅動開發。
CppUnit:由JUnit移植過來的C++測試框架
CTest:CMake測試驅動程序
googletest:谷歌C++測試框架
ig-debugheap:用於跟蹤內存錯誤的多平台調試堆
libtap:用C語言編寫測試
MemTrack —用於C++跟蹤內存分配
microprofile- 跨平台的網路試圖分析器
minUnit :使用C寫的迷你單元測試框架,只使用了兩個宏
Remotery:用於web視圖的單一C文件分析器
UnitTest++:輕量級的C++單元測試框架
Cocos2d-x :一個跨平台框架,用於構建2D 游戲 ,互動圖書,演示和其他圖形應用程序。
Grit :社區項目,用於構建一個免費的 游戲 引擎,實現開放的世界3D 游戲 。
Irrlicht :C++語言編寫的開源高性能的實時#D引擎
Polycode:C++實現的用於創建 游戲 的開源框架(與Lua綁定)。
CEGUI : 很靈活的跨平台GUI庫
FLTK :快速,輕量級的跨平台的C++GUI工具包。
GTK+: 用於創建圖形用戶界面的跨平台工具包
gtkmm :用於受歡迎的GUI庫GTK+的官方C++介面。
imgui:擁有最小依賴關系的立即模式圖形用戶界面
libRocket :libRocket 是一個C++ HTML/CSS 游戲 介面中間件
MyGUI :快速,靈活,簡單的GUI
Ncurses:終端用戶界面
QCustomPlot :沒有更多依賴關系的Qt繪圖控制項
Qwt :用戶與技術應用的Qt 控制項
QwtPlot3D :功能豐富的基於Qt/OpenGL的C++編程庫,本質上提供了一群3D控制項
OtterUI :OtterUI 是用於嵌入式系統和互動 娛樂 軟體的用戶界面開發解決方案
PDCurses 包含源代碼和預編譯庫的公共圖形函數庫
wxWidgets C++庫,允許開發人員使用一個代碼庫可以為widows, Mac OS X,Linux和其他平台創建應用程序
bgfx:跨平台的渲染庫
Cairo:支持多種輸出設備的2D圖形庫
Horde3D 一個小型的3D渲染和動畫引擎
magnum C++11和OpenGL 2D/3D 圖形引擎
Ogre 3D 用C++編寫的一個面向場景,實時,靈活的3D渲染引擎(並非 游戲 引擎)
OpenSceneGraph 具有高性能的開源3D圖形工具包
Panda3D 用於3D渲染和 游戲 開發的框架,用Python和C++編寫。
Skia 用於繪制文字,圖形和圖像的完整的2D圖形庫
urho3d 跨平台的渲染和 游戲 引擎。
Boost.GIL:通用圖像庫
CImg :用於圖像處理的小型開源C++工具包
CxImage :用於載入,保存,顯示和轉換的圖像處理和轉換庫,可以處理的圖片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。
FreeImage :開源庫,支持現在多媒體應用所需的通用圖片格式和其他格式。
GDCM:Grassroots DICOM 庫
ITK:跨平台的開源圖像分析系統
Magick++:ImageMagick程序的C++介面
MagickWnd:ImageMagick程序的C++介面
OpenCV : 開源計算機視覺類庫
tesseract-ocr:OCR引擎
VIGRA :用於圖像分析通用C++計算機視覺庫
VTK :用於3D計算機圖形學,圖像處理和可視化的開源免費軟體系統。
最後, 對於學習編程或者在工作想升職的程序員兄弟,如果你想更好的提升你的編程能力幫助你提升水平! 筆者這里或許可以幫到你~
編程學習書籍分享:
編程學習視頻分享:
分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!