数据结构相关C语言代码
生活随笔
收集整理的這篇文章主要介紹了
数据结构相关C语言代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
順序存儲結構
#include<stdio.h> #include<stdlib.h>typedef struct Arr {int *pBase;//第一個下標的地址 (類似于數組名) int lenth;//總長度(最多可存儲數據) int cnt;//實際數據長度 }*PARR,ARR;void init(PARR pArr,int len);//初始化數組 void show_arr(PARR pArr);//輸出數組 bool is_empty(PARR pArr);//判斷數組是否為空 bool is_full(PARR pArr);// 判斷數組是否已滿 bool append_arr(PARR pArr,int val);//在數組尾部增添數據val bool insert_arr(PARR pArr,int pos,int val);//在數組第pos個位置前插入數據val bool delete_arr(PARR pArr,int pos,int *pVal);//刪除鏈表中第pos位置的數據,并把刪除的數據存入*pVal中; void inversion_arr(PARR pArr);//將數組逆序 void sort_arr(PARR pArr);//將數組內元素排序 int main() {ARR arr;int pos1,val1,pos2,dnum;init(&arr,6);printf("初始化后");show_arr(&arr);for(int i=1;i<=5;i++)append_arr(&arr,i);printf("\n增添后的");show_arr(&arr);printf("\n請輸入插入的位置:");scanf("%d",&pos1);printf("請輸入插入的數據:");scanf("%d",&val1);if(insert_arr(&arr,pos1,val1)){printf("插入后的");show_arr(&arr);}else{printf("插入失敗");}printf("\n請輸入刪除的位置:");scanf("%d",&pos2);if(delete_arr(&arr,pos2,&dnum)){printf("刪除的數據為:%d",dnum);printf("\n刪除后的");show_arr(&arr);} else{printf("刪除失敗");}inversion_arr(&arr);printf("\n逆序后的");show_arr(&arr);sort_arr(&arr);printf("\n排序后的");show_arr(&arr);return 0; } void init(PARR pArr,int len)//pArr只是定義的結構體指針,通過它可以調用結構體中的數據 {pArr->pBase=(int *)malloc(sizeof(int)*len);//分配大小為len的空間為數組空間,此時pBase可當數組用 if(pArr->pBase==NULL){printf("內存分配失敗!!");exit(-1);}else{pArr->lenth=len; pArr->cnt=0;}return ; } void show_arr(PARR pArr) {if(is_empty(pArr))printf("順序鏈表為空!!");else{printf("順序鏈表為:");for(int i=0;i<pArr->cnt;i++)printf("%d ",pArr->pBase[i]);//輸出pArr指向的結構體中的pBase數組 }return ; } bool is_empty(PARR pArr) {if(pArr->cnt==0)//實際長度為0才為空 return true;elsereturn false; } bool is_full(PARR pArr) {if(pArr->cnt==pArr->lenth)//實際長度和最大長度相同是該數組已滿 return true;elsereturn false; } bool append_arr(PARR pArr,int val) {if(is_full(pArr))//若數組已滿則無法再在后面容納數據 return false;pArr->pBase[pArr->cnt]=val;//注意:第cnt個數據的數組下標為cnt-1 pArr->cnt++;//實際長度++ return true; } bool insert_arr(PARR pArr,int pos,int val) {if(is_full(pArr))//若數組已滿則無法再有插入內存 return false;if(pos<1||pos>pArr->cnt+1)//需要保證插入的位置存在,不能在小于實際長度cnt的位置插入,但是可以在最后一個數據cnt-1后的cnt插入,大于cnt+1的位置也不行,否則中間會存在空位 return false;for(int i=pArr->cnt-1;i>=pos-1;i--)//注意:第cnt個數據的數組下標為cnt-1,第pos個數據的數組下標為pos-1,若數組不為空則pos和cnt都不會為0pArr->pBase[i+1]=pArr->pBase[i];//通過循環實現第pos及以后的數據后移一位; pArr->pBase[pos-1]=val;//第pos個位置插入了數據val pArr->cnt++;//插入后長度++ return true; } bool delete_arr(PARR pArr,int pos,int *pVal) {if(is_empty(pArr))return false;if(pos<1||pos>pArr->cnt)//刪除的位置不能不存在 return false;*pVal=pArr->pBase[pos-1]; //將刪除的數據進行存儲; for(int i=pos;i<pArr->cnt;i++)pArr->pBase[i-1]=pArr->pBase[i];//讓刪除位置的后面的數據覆蓋該刪除數據,后面數據并整體前移 pArr->cnt--;//順序鏈表長度-- return true; } void inversion_arr(PARR pArr) {int i=0;//i為第一個元素下標 int j=pArr->cnt-1;//j為最后一個元素下標 int t;while(i<j)//頭和尾依次逐漸交換,直到i,j相遇 {t=pArr->pBase[i];pArr->pBase[i]=pArr->pBase[j];pArr->pBase[j]=t;i++;j--; }return ; } void sort_arr(PARR pArr) {int i,j,t;for(i=0;i<pArr->cnt-1;i++){for(j=i+1;j<pArr->cnt;j++){if(pArr->pBase[i]>pArr->pBase[j]){t=pArr->pBase[i];pArr->pBase[i]=pArr->pBase[j];pArr->pBase[j]=t;}}}return ; }鏈式存儲結構:
#include<stdio.h> #include<stdlib.h>typedef struct Node {int data;struct Node *pNext; } *PNODE;PNODE creat_list(void);//創建鏈表 void traverse(PNODE pHead);//輸出鏈表 bool is_empty(PNODE pHead);//判斷該鏈表是否為空表 int lenth_list(PNODE pHead);//求該鏈表的長度 void sort_list(PNODE pHead);//給鏈表順序排序 bool insert_list(PNODE pHead,int pos,int val);//從鏈表的第pos個位置插入數據val bool delete_list(PNODE pHead,int pos,int *pVal);//刪除鏈表的第pos位置的數據并將數據存入指針pVal中;int main() {int pos,val,pos2,val2; PNODE pHead=NULL;pHead=creat_list();//創建鏈表 if(is_empty(pHead)==false)//判斷鏈表是否為空 {printf("\n該鏈表為空!!!");}else{traverse(pHead);//輸出鏈表 printf("\n該鏈表為非空!!!"); printf("\n鏈表長度為%d",lenth_list(pHead));//計算長度 sort_list(pHead);//排序 printf("\n排序后");traverse(pHead);printf("\n請輸入您要插入的位置:");//插入 scanf("%d",&pos);if(pos>lenth_list(pHead)+1){printf("無法插入");}else{printf("請輸入您要插入的數據為:");scanf("%d",&val);insert_list(pHead,pos,val);printf("插入后");traverse(pHead);}printf("\n請輸入您要刪除的節點位置:");scanf("%d",&pos2);if(delete_list(pHead,pos2,&val2)){printf("刪除成功,您刪除的節點數據為%d",val2);printf("\n刪除后"); traverse(pHead);}else{printf("刪除失敗,該節點不存在");}} return 0; } PNODE creat_list(void) {int len;int val;int i;printf("請輸入您創造的鏈表長度:");scanf("%d",&len);PNODE pHead=(PNODE)malloc(sizeof(Node));if(pHead==NULL){printf("錯誤!!!");exit(-1);}PNODE pTail=pHead;pTail->pNext=NULL;for(i=0;i<len;i++){printf("請輸入第%d個數據:",i+1);scanf("%d",&val);PNODE pNew=(PNODE)malloc(sizeof(Node));if(pNew==NULL){printf("錯誤!!!");exit(-1); }pNew->data=val;pTail->pNext=pNew;pNew->pNext=NULL;pTail=pNew;}/*pTail->pNext=NULL;*/return pHead; } void traverse(PNODE pHead) {PNODE p=pHead->pNext;printf("該鏈表為:"); while(p!=NULL){printf("%d ",p->data);p=p->pNext;}return ; } bool is_empty(PNODE pHead) {if(pHead->pNext==NULL)return false;elsereturn true; } int lenth_list(PNODE pHead) {PNODE p=pHead->pNext;int len=0;while(p!=NULL){len++;p=p->pNext;}return len; } void sort_list(PNODE pHead) {int i,j,t,len=lenth_list(pHead);PNODE q,p;for(i=0,q=pHead->pNext;i<len-1;i++,q=q->pNext){for(j=i+1,p=q->pNext;j<len;j++,p=p->pNext){if(q->data>p->data){t=q->data;q->data=p->data;p->data=t;}}} } bool insert_list(PNODE pHead,int pos,int val) {int i=1;PNODE p=pHead;while(p!=NULL&&i<pos)//p是插入位置前的那一個整體數據 {p=p->pNext;i++;}if(p==NULL||i>pos)return false;PNODE pNew=(PNODE)malloc(sizeof(Node));if(pNew==NULL){printf("錯誤!!!");exit(-1);}pNew->data=val;pNew->pNext=p->pNext;p->pNext=pNew;return true; } bool delete_list(PNODE pHead,int pos,int *pVal) {int i=1;PNODE p=pHead;while(p->pNext!=NULL&&i<pos){p=p->pNext;i++;}if(p->pNext==NULL||i>pos)return false;PNODE q=p->pNext;*pVal=q->data;p->pNext=q->pNext;free(q);return true; }鏈式棧:
#include<stdio.h> #include<stdlib.h>typedef struct Node//節點結構 {int data;struct Node *pNext; }*PNODE;typedef struct Stack//棧的頭節點和尾節點 {PNODE pTop;PNODE pBottom; }STACK,*PSTACK;void init(PSTACK pS);//初始化 void push(PSTACK pS,int val);//壓棧 bool pop(PSTACK pS,int *pVal);//出棧 void traverse(PSTACK pS);//輸出棧 bool is_empty(PSTACK pS);//判斷棧是否為空 void clear_stack(PSTACK pS);//清空棧內數據 int main() {int i,val;STACK S;init(&S);for(i=10;i>=0;i--)push(&S,i);traverse(&S);pop(&S,&val);printf("\n刪除的頂部數據為:%d\n",val);traverse(&S);clear_stack(&S);printf("\n棧清空后"); traverse(&S);return 0; } void init(PSTACK pS) {pS->pTop=(PNODE)malloc(sizeof(Node));if(pS->pTop==NULL){printf("分配失敗!!!");exit(-1);}else{pS->pBottom=pS->pTop;pS->pTop->pNext=NULL;} } void push(PSTACK pS,int val) {PNODE pNew=(PNODE)malloc(sizeof(Node));pNew->data=val;pNew->pNext=pS->pTop;pS->pTop=pNew; } bool is_empty(PSTACK pS) {if(pS->pTop==pS->pBottom)return true;elsereturn false; } bool pop(PSTACK pS,int *pVal) {if(is_empty(pS))//如果為真 return false;else{PNODE p=pS->pTop;*pVal=p->data;pS->pTop=p->pNext;free(p);p=NULL;return true;} } void traverse(PSTACK pS) {PNODE p=pS->pTop;printf("該棧為:");while(p!=pS->pBottom){printf("%d ",p->data);p=p->pNext;} } void clear_stack(PSTACK pS) {if(is_empty(pS))return ;else{PNODE p=pS->pTop;PNODE q=NULL;while(p!=pS->pBottom){q=p->pNext;free(p);p=q;}}pS->pTop=pS->pBottom; }循環隊列
#include<stdio.h> #include<stdlib.h> # define size 6typedef struct Queue {int *pBase;int front;int rear; }QUEUE,*PQUEUE;void init(PQUEUE Q); void traverse_queue(PQUEUE Q); bool is_empty(PQUEUE Q); bool is_full(PQUEUE Q); bool EnQueue(PQUEUE Q,int val); bool DeQueue(PQUEUE Q,int *pVal);int main() {QUEUE Q;int i,val1,val2;init(&Q);for(i=0;i<4;i++)EnQueue(&Q,i);traverse_queue(&Q);printf("\n請輸入入隊的數據為:");scanf("%d",&val1);EnQueue(&Q,val1);printf("插入后");traverse_queue(&Q);DeQueue(&Q,&val2);printf("\n出隊的數據為:%d",val2);printf("\n刪除后");traverse_queue(&Q);return 0; } void init(PQUEUE Q) {Q->pBase=(int*)malloc(sizeof(int)*size);if(!Q->pBase){printf("內存分配失敗!!");exit(-1);}Q->front=0;Q->rear=0;return ; } void traverse_queue(PQUEUE Q) {int p=Q->front;printf("該隊列為:");while(p!=Q->rear){printf("%d ",Q->pBase[p]);p=(p+1)%size;}return ; } bool is_empty(PQUEUE Q) {if(Q->front==Q->rear)return true;elsereturn false; } bool is_full(PQUEUE Q) {if((Q->rear+1)%size==Q->front)return true;elsereturn false; } bool EnQueue(PQUEUE Q,int val)//入隊,隊尾后移一位存入新數據 {if(is_full(Q))return false;else{Q->pBase[Q->rear]=val;Q->rear=(Q->rear+1)%size;return true;} } bool DeQueue(PQUEUE Q,int *pVal)//出隊,隊首后移一位,注意移動方向與隊尾相同 {if(is_empty(Q))return false;else{*pVal=Q->pBase[Q->front];Q->front=(Q->front+1)%size;return true;} }二叉鏈表(二叉樹)
//測試樣例:ABC##DE#G##F### #include<stdio.h> #include<stdlib.h>typedef struct BtNode {char data;struct BtNode *lchild;struct BtNode *rchild; }BiTNode,*BiTree;void creat_btree(BiTree *T);//創建樹 void Midtraverse_btree(BiTree T);//中序遍歷輸出樹 void copy(BiTree T,BiTree *NewT);//復制樹 int depth(BiTree T);//計算樹的深度 int NodeCount(BiTree T);//計算樹的節點數 int LeafCount(BiTree T);//計算葉子節點的個數 int main() {BiTree T=NULL;BiTree NewT=NULL;creat_btree(&T);printf("中序輸出該樹為:");Midtraverse_btree(T);copy(T,&NewT);printf("\n復制后中序輸出該樹為:"); Midtraverse_btree(NewT);printf("\n該樹深度為:%d",depth(T));printf("\n該樹的節點數為:%d",NodeCount(T));printf("\n該樹的葉子節點數為:%d",LeafCount(T));return 0; } void creat_btree(BiTree *T) {char ch;scanf("%c",&ch);if(ch=='#')*T=NULL;else{*T=(BiTree)malloc(sizeof(BiTNode));(*T)->data=ch;creat_btree(&(*T)->lchild);creat_btree(&(*T)->rchild);}return ; } void Midtraverse_btree(BiTree T) {if(T){if(T->lchild)Midtraverse_btree(T->lchild);printf("%c ",T->data);if(T->rchild)Midtraverse_btree(T->rchild);}return ; } void copy(BiTree T,BiTree *NewT)//修改節點所指向的內存時一定要記住用二級指針 {if(!T)*NewT=NULL;else{*NewT=(BiTree)malloc(sizeof(BiTNode));(*NewT)->data=T->data;copy(T->lchild,&(*NewT)->lchild);copy(T->rchild,&(*NewT)->rchild);}return ; } int depth(BiTree T) {if(!T)return 0;else{int m=0,n=0;m=depth(T->lchild);n=depth(T->rchild);if(m>n)return m+1;elsereturn n+1;} } int NodeCount(BiTree T) {if(!T)return 0;elsereturn NodeCount(T->lchild)+NodeCount(T->rchild)+1; } int LeafCount(BiTree T) {if(!T)return 0;if(!T->lchild&&!T->rchild)return 1;elsereturn LeafCount(T->lchild)+LeafCount(T->rchild); }鄰接矩陣
#include<iostream> #include<stdlib.h> #define MVnum 100 #define MaxInt 0 using namespace std;typedef struct Graph {char vexs[MVnum];int arcs[MVnum][MVnum];int vexnum,arcnum; } AMGraph;void creatUDN(AMGraph &G); void traverse_graph(AMGraph G); int LocateVex(AMGraph G,char ch);int main() {AMGraph G;creatUDN(G);traverse_graph(G);return 0; } void creatUDN(AMGraph &G) {int i,j,k;cout<<"請分別輸入頂點數和邊數:";cin>>G.vexnum>>G.arcnum;for(i=0;i<G.vexnum;i++){printf("\n請輸入第%d個頂點:",i+1);cin>>G.vexs[i];}for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++)G.arcs[i][j]=MaxInt;}for(k=0;k<G.arcnum;k++){char v1,v2;int m,n,w;printf("\n請輸入第%d條邊的兩個頂點和權值:",k+1);cin>>v1>>v2>>w;m=LocateVex(G,v1);n=LocateVex(G,v2);G.arcs[m][n]=w;G.arcs[n][m]=G.arcs[m][n];}return ; } void traverse_graph(AMGraph G) {int i,j;for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++)printf("%d ",G.arcs[i][j]);cout<<endl;}return ; } int LocateVex(AMGraph G,char ch) {int i;for(i=0;i<G.vexnum;i++){if(G.vexs[i]==ch)return i;}return -1; }鄰接表
#include<iostream> #include<stdlib.h> using namespace std;#define MVnum 100typedef struct Arcnode {int adjvex;struct Arcnode *nextarc;int info; }ArcNode; typedef struct Vnode {char data;ArcNode *firstarc; }VNode,AdjList[MVnum]; typedef struct Graph {AdjList vertices;int vexnum,arcnum; }ALGraph;void creatUDG(ALGraph &G); void traverse(ALGraph G); int LocateVex(ALGraph G,char ch);int main() {ALGraph G;creatUDG(G);traverse(G);return 0; } void creatUDG(ALGraph &G) {int i,j,k;ArcNode *p1,*p2;char v1,v2;printf("請輸入頂點數和邊數:");cin>>G.vexnum>>G.arcnum;for(i=0;i<G.vexnum;i++){printf("\n請輸入第%d個頂點:",i+1);cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;}for(k=0;k<G.arcnum;k++){printf("\n請輸入第%d條邊的兩個頂點:",k+1);cin>>v1>>v2;i=LocateVex(G,v1);j=LocateVex(G,v2);p1=new ArcNode;p1->adjvex=j;p1->nextarc=G.vertices[i].firstarc;G.vertices[i].firstarc=p1;p2=new ArcNode;p2->adjvex=i;p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;}return ; } void traverse(ALGraph G) {int i;printf("鄰接表為:\n");for(i=0;i<G.vexnum;i++){char q=G.vertices[i].data;ArcNode *p=G.vertices[i].firstarc;printf("%c ",q);while(p){printf("%d ",p->adjvex);p=p->nextarc;}printf("\n");}return ; } int LocateVex(ALGraph G,char ch) {int i;for(i=0;i<G.vexnum;i++){if(G.vertices[i].data==ch)return i;}return -1; }這些只是部分主要基本函數,數據類型部分用的整型,可供參考(若有問題和錯誤請及時提出!!!)
總結
以上是生活随笔為你收集整理的数据结构相关C语言代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21. 合并两个有序链表(C语言)
- 下一篇: 203. 移除链表元素(C语言)