总结大学一些常见数据结构简单实现(cc++语言)
小引:
笔者是一个大三本科生,目前在备考研复习,在进行计算机统考复习数据结构当中,所以有时间在看到很久以前学习的数据结构和算法实现的上机操作以及自己平时编写的数据结构代码,一同把它分享到这里来,因为是初学到复习考研这个过程,不免会有错误和不足,所以希望得到园友批评和建议,实现环境是vc6.0,语言是c或者c++,希望得到初学者喜欢,大牛可以飞过 !!!!
理解算法和程序的关系,掌握顺序表的基本操作
内容:(1) 在一个递增有序的顺序表中插入一个元素,使插入之后仍有序
(2) 将顺序表L逆置
#include "stdlib.h"#include <iostream.h> typedef int ElemType; /* 顺序表定义,书20 */#define LIST_INIT_SIZE 100 #define LISTINCREMENT 10typedef struct { ElemType *elem;int length;int listsize;} SqList; /* 生成具有n个元素的顺序表 L,类似书P21,算法2_1 */void Creat_Sq(SqList &L,int n){ L.elem=new ElemType[LIST_INIT_SIZE];for(int i=1;i<=n;i++) L.elem[i-1]=2*i;//直接生成 L.length=n; L.listsize=LIST_INIT_SIZE;} void Increament(SqList &L){//当前存储空间已满,增加分配空间 ElemType *a=new ElemType[L.listsize+ LISTINCREMENT];for (int i=0;i<L.length;i++) a[i]=L.elem[i]; delete []L.elem; L.elem=a; L.listsize=L.listsize+ LISTINCREMENT; } void ListInsert_Sq(SqList &L, int i,ElemType e) {//将e插入到顺序表L中第i个元素之前if(i<1||i>L.length+1) {cout<<"ERROR";exit(-1);} if (L.length>L.listsize) Increament(L); ElemType* q=&(L.elem[i-1]);for (ElemType* p=&(L.elem[L.length-1]); p>=q;--p) *(p+1)=*p; *q=e; ++L.length; } /* 主函数 */void main(){ SqList L;int i,e,m; cout<<"请输入元素个数:"<<endl; cin>>m; /* 生成具有n个元素的顺序表L*/ Creat_Sq( L, m); /* 显示该顺序表 */ cout<<"\n该顺序表为: \n"<<endl;for (i=1;i<=L.length;i++) cout<<""<<L.elem[i-1]; cout<<endl<<"请输入插入位置及元素:"<<endl; cin>>i>>e; /* 在L中插入元素e , 注意函数调用的格式*/ ListInsert_Sq (L,i,e); for (i=1;i<=L.length;i++) cout<<""<<L.elem[i-1]; cout<<endl;/*逆序排*/ cout<<" 逆序输出"<<endl;for(i=L.length;i>=1;i--) cout<<""<<L.elem[i-1]; }
进一步掌握顺序表的操作
内容:(1) 将两个递增有序的顺序表合并为一个递增有序的顺序表,并显示
(2) 将顺序表L逆置
以下代码为:把两个递增有序的单链表归并为一个递增有序的链表,辅助空间为O(1)#include<iostream>usingnamespace std;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList;void CreatList(LinkList &L,int n){ LinkList p,q; L=new LNode; L->next=NULL; q=L; cout<<"请从小到大输入链表的元素:";for(int i=1;i<=n;i++) { p=new LNode; cin>>p->data; p->next=q->next; q->next=p; q=q->next; } cout<<"所创建得的递增有序链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void CreatC(LinkList &A,LinkList &B,LinkList &C,int n){ LinkList p,q,t; p=A->next; q=B->next; C=t=A;while(p&&q) {if(p->data<=q->data) { t->next=p; t=p; p=p->next; }else { t->next=q; t=q; q=q->next; } } t->next=p?p:q; delete B; cout<<"合并后的递增有序链表为:"; p=C->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void main(){ LinkList A,B,C;int n,m,k; cout<<"请输入链表***A***的长度:"; cin>>n; CreatList(A,n); cout<<"请输入链表***B***的长度:"; cin>>m; CreatList(B,m); k=m+n; CreatC(A,B,C,k); }
掌握链表的基本操作
内容:(1) 建立一个单链表,并写一个函数来显示链表中的元素
(2)在一个单链表中查找元素X,找到,显示其序号,否则显示”未找到”
#include<iostream>usingnamespace std;typedef int ElemType; typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList; void InitList_L(LinkList &L){ L=new LNode; L->next=NULL;} void CreateList_L(LinkList &L,int n){ InitList_L(L);for(int i=n;i>0;--i) { LNode *p=new LNode; cin>>p->data; p->next=L->next; L->next=p; }} void print(LinkList L){ LNode *p=new LNode; p=L->next;while(p) { cout<<p->data<<""; p=p->next; } } void Find(LinkList L,ElemType a){int i=1,j=0; LNode *p=new LNode; p=L->next;while(p) {if(p->data==a) { cout<<"您要查找的数据 "<<a<<" 在单链表中为 "<<i<<" 号元素!\n"; j++; } i++; p=p->next; }if(j==0) cout<<"您要查找的数据不在单链表中!\n";} void main(){int n; ElemType a; LinkList L; cout<<"请输入您要输入的单链表的数据个数n:\n"; cin>>n; cout<<"请输入(逆序输入)您要输入的数据:\n"; CreateList_L(L,n); cout<<"依次输出链表中的数据为:\n"; print(L); cout<<"\n"; cout<<"请输入您要查找的数据a:\n"; cin>>a; Find(L,a);}
通过实验理解栈和队列的应用
内容:(1) 用栈实现数制转换
(2) 输入一个算术表达式,其中含有( 、[ 两种括号,判断括号是否匹配
#include<iostream>usingnamespace std; #define SElemType int#define Stack_Init_Size 20#define Stack_Increment 10 typedef struct{SElemType *elem;int top;int stacksize;int incrementsize;}SqStack; void InitStack(SqStack &s){ //初始化栈s.elem=new SElemType[Stack_Init_Size];s.top=-1;s.stacksize=Stack_Init_Size;s.incrementsize=Stack_Increment;} void StackIncrement(SqStack &s){ //增加栈长度SElemType *a;a=new SElemType[s.stacksize+s.incrementsize];for(int i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.stacksize=s.stacksize+s.incrementsize;} void Push_stack(SqStack &s,SElemType x){ //入栈if(s.top==(s.incrementsize-1))StackIncrement(s);s.elem[++s.top]=x;} void Get_num(int&a){ //输入十进制数cout<<"请输入十进制数"<<endl;cin>>a;} void change(SqStack &s,int x){ //十进制转化为二进制,并用栈储存while (x!=1){Push_stack(s,x%2);x=x/2;}Push_stack(s,x);} void Output(SqStack &s){ //十进制数以二进制形式输出cout<<"转为二进制:"<<endl;for(int a=s.top;a>=0;a--)cout<<s.elem[a];cout<<endl;} void main (){SqStack ss;InitStack(ss);int s;Get_num(s);change(ss,s);Output(ss);}#include<iostream>usingnamespace std; #define SElemType char #define Stack_Init_Size 20#define Stack_Increment 10 typedef struct{ SElemType *elem;int top;int stacksize;int incrementsize;}SqStack; void InitStack(SqStack &s){ //用于初始化栈s.elem=new SElemType[Stack_Init_Size];s.top=-1;s.stacksize=Stack_Init_Size;s.incrementsize=Stack_Increment;} void StackIncrement(SqStack &s){ //用于增加栈长SElemType *a;a=new SElemType[s.stacksize+s.incrementsize];for(int i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.stacksize=s.stacksize+s.incrementsize;} void Push_stack(SqStack &s,SElemType x){ //入栈if(s.top==(s.incrementsize-1))StackIncrement(s);s.elem[++s.top]=x;} void Pop_Stack(SqStack &s){ //出栈s.top--;} void Get_C(char x[]){ //获取表达式,用数组存放cout<<"请输入表达式(以等号结束):"<<endl;for(int i =0;;i++){cin>>x[i];if(x[i]=='=')break;}} void match(SqStack &s,char x[]){ //进行括号的匹配判断int n=1; //辅助量,用于判断括号的顺序性是否为真for(int i=0;;i++){if(x[i]=='(')Push_stack(s,'a');if(x[i]=='[') Push_stack(s,'b'); if(x[i]==')'){ if(s.elem[s.top]=='a')Pop_Stack(s); else{n=0;break;}}if(x[i]==']'){if(s.elem[s.top]=='b')Pop_Stack(s); else{n=0;break;}}if(x[i]=='=')break;}if((n==1)&&(s.top==-1)) //若判断括号的顺序性为真,在判断是否一一匹配cout<<"括号相匹配"<<endl;elsecerr<<"括号不匹配"<<endl; } void main (){SqStack ss;char x[10];InitStack(ss);Get_C(x);match(ss,x);}
通过实验理解栈和队列的应用 (没有完成)
内容:(1) 输入一字符串,利用栈和队列判断是否是回文
(2)编写递归函数,求正整数N的阶乘N!; 再编写函数,用栈实现求N的阶乘,体会栈与递归的关系
#include<iostream>usingnamespace std; #define SElemType char #define Stack_Init_Size 20#define Stack_Increment 10 typedef struct{ SElemType *elem;int top;int stacksize;int incrementsize;}SqStack; void InitStack(SqStack &s){ //用于初始化栈s.elem=new SElemType[Stack_Init_Size];s.top=-1;s.stacksize=Stack_Init_Size;s.incrementsize=Stack_Increment;} void StackIncrement(SqStack &s){ //用于增加栈长SElemType *a;a=new SElemType[s.stacksize+s.incrementsize];for(int i=0;i<=s.top;i++)a[i]=s.elem[i];delete []s.elem;s.elem=a;s.stacksize=s.stacksize+s.incrementsize;} void Push_stack(SqStack &s,SElemType x){ //入栈if(s.top==(s.incrementsize-1))StackIncrement(s);s.elem[++s.top]=x;} void Pop_Stack(SqStack &s){ //出栈s.top--;} void Get_C(char x[],int&y){ //获取表达式,用数组存放cout<<"请输入表达式(以#结束):"<<endl;for(int i =0;;i++){{cin>>x[i];y++;}if(x[i]=='#')break;}} void Judgment(SqStack &s,char x[],int y){int i;for(i=0;i<(y-2)/2.0;i++)Push_stack(s,x[i]);if((y-1)%2==0) ;elsei=i+1;for(;i<y;i++){if(x[i]==s.elem[s.top]) Pop_Stack(s);}if(s.top==-1)cout<<"回文!"<<endl;elsecout<<"非回文!"<<endl; } void main (){SqStack ss;char x[20];int y=0;InitStack(ss);Get_C(x,y);Judgment(ss,x,y);}
通过实验理解二叉树的存储和操作
内容: (1)建立二叉树的二叉链表存储,并对它进行中序遍历
(2)求二叉树的结点数
(3)求高度
#include"iostream.h"typedef char TElemType;typedef struct BiTNode{ TElemType data;struct BiTNode *lchild;struct BiTNode *rchild;}BiTNode;typedef BiTNode *BiTree;void CreateBiTree_Rec(BiTree &T){ TElemType ch; cin>>ch;if(ch=='#') T=NULL;else { T=new BiTNode; T->data=ch; CreateBiTree_Rec(T->lchild); CreateBiTree_Rec(T->rchild); }}void InOrder_Rec(BiTree T){if(T) { InOrder_Rec(T->lchild); cout<<T->data; InOrder_Rec(T->rchild); }}int Leafs_Rec(BiTree T){int l_Leafs,r_Leafs;staticint i=0;if(T==NULL)return0;else { i++; l_Leafs=Leafs_Rec(T->lchild); r_Leafs=Leafs_Rec(T->rchild); }return i;}int Leafs_Rec1(BiTree T){int l_Leafs,r_Leafs;if(T==NULL)return0;else {if((T->lchild==NULL)&&(T->rchild==NULL))return1;else { l_Leafs=Leafs_Rec1(T->lchild); r_Leafs=Leafs_Rec1(T->rchild);return (l_Leafs+r_Leafs); } }}int BiTreeDepth_Rec(BiTree T){int depth_l,depth_r;if(!T)return0;else { depth_l=BiTreeDepth_Rec(T->lchild); depth_r=BiTreeDepth_Rec(T->rchild); if(depth_l>=depth_r)return (depth_l+1);elsereturn (depth_r+1); }}void main(){ BiTree T; cout<<"请按要求(前序序列建立)输入您所要输入的字符串:\n"; CreateBiTree_Rec(T); cout<<"中序递归遍历输出为:\n"; InOrder_Rec(T); cout<<endl; cout<<"该二叉树的结点数目为:"<<Leafs_Rec(T)<<endl; cout<<"该二叉树的叶子结点数目为:"<<Leafs_Rec1(T)<<endl; cout<<"该二叉树的深度为:"<<BiTreeDepth_Rec(T)<<endl;}
通过实验理解图的存储和搜索算法
内容:1。建立一个无向图的邻接表存储
2。对该图进行深度优先搜索,按顺序输出所访问的
#include<iostream.h>#define MAX_VERTEX_NUM 20typedef char VertexType;typedef enum{FALSE,TRUE}Boolean;Boolean visited[MAX_VERTEX_NUM];typedef struct EdgeNode //表结点{int adjvex;struct EdgeNode *nextedge;}EdgeNode;typedef struct VerNode //头结点{ VertexType vex; EdgeNode *firstedge;}VerNode,AdjList[MAX_VERTEX_NUM];typedef struct{ AdjList vertices;int vexnum,edgenum;}ALGraph;int LocateVex_ALG(ALGraph G,VertexType x) //确定x在G中的位置{int k=-1;for(k=0;(k<G.vexnum)&&(G.vertices[k].vex!=x);++k);return k;}void CreateNDG_ALG(ALGraph &G) //构造图的邻接表{int i,j,k; VertexType v1,v2; cout<<"请输入图的顶点数和边数:\n"; cin>>G.vexnum>>G.edgenum; cout<<"请输入顶点的内容:\n";for(i=0;i<G.vexnum;++i) { cin>>G.vertices[i].vex; G.vertices[i].firstedge=NULL; } cout<<"请依次输入每条边的初始和终点的顶点内容:\n";for(k=0;k<G.edgenum;++k) { cin>>v1>>v2; i=LocateVex_ALG(G,v1); j=LocateVex_ALG(G,v2); EdgeNode *p=new EdgeNode; p->adjvex=j; p->nextedge=G.vertices[i].firstedge; G.vertices[i].firstedge=p; }}void DFS(ALGraph G,int v){int w; EdgeNode *p; visited[v]=TRUE; cout<<G.vertices[v].vex<<""; //输出顶点数据for(p=G.vertices[v].firstedge;p;p=p->nextedge) { w=p->adjvex;if(!visited[w]) DFS(G,w); }}void DFSTraverse(ALGraph G){int v;for(v=0;v<G.vexnum;++v) visited[v]=FALSE; cout<<"按深度优先遍历顺序依次输出顶点为:\n";for(v=0;v<G.vexnum;++v)if(!visited[v]) DFS(G,v); cout<<endl;}void main(){ ALGraph G; CreateNDG_ALG(G); //由邻接表构造无向图 DFSTraverse(G); //按深度优先遍历顺序遍历该无向图}
通过实验理解图的存储和搜索算法
内容:1。构造图的邻接矩阵
2。对该图广度优先遍历
#include<iostream.h>#define MAX_VERTEX_NUM 20#define QUEUE_INIT_SIZE 100typedef enum{DG,DN,UDG,UDN}GraphKind;typedef char VertexType;typedef int EdgeType;typedef enum{FALSE,TRUE}Boolean;Boolean visited[MAX_VERTEX_NUM];typedef char QElemType;typedef struct{ QElemType *elem;char front;char rear;char queuesize;}SqQueue;typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vexnum,edgenum;}MGraph;void InitQueue_Sq(SqQueue &Q) //队列{ Q.elem=new QElemType[QUEUE_INIT_SIZE]; Q.front=Q.rear=0; Q.queuesize=QUEUE_INIT_SIZE;}void EnQueue_Sq(SqQueue &Q,QElemType e){if(((Q.rear+1)%Q.queuesize)==Q.front) Q.elem[Q.rear]=e; Q.rear=(Q.rear+1)%Q.queuesize;}QElemType DeQueue_Sq(SqQueue &Q){ QElemType e; e=Q.elem[Q.front]; Q.front=(Q.front+1)%Q.queuesize;return e;}int LocateVex_MG(MGraph G,VertexType x) //构造图的邻接矩阵{int k=-1;for(k=0;(k<G.vexnum)&&(G.vexs[k]!=x);++k);return k;}void CreatUDG_MG(MGraph &G){int i=0,j=0,k=0; VertexType v1,v2; cout<<"请输入图(无向图)的顶点数和边数:\n"; cin>>G.vexnum>>G.edgenum; cout<<"请输入顶点的内容:\n";for(i=0;i<G.vexnum;++i) cin>>G.vexs[i];for(i=0;i<G.vexnum;++i)for(j=0;j<G.vexnum;++j) G.edges[i][j]=0; cout<<"请依次输入每条边的初始和终点:\n";for(k=0;k<G.edgenum;++k) { cin>>v1>>v2; i=LocateVex_MG(G,v1); j=LocateVex_MG(G,v2);while((i<0)||(i>(G.vexnum-1))||(j<0)||(j>(G.vexnum-1))) { cout<<"编码超出范围,请重新输入:\n"; cin>>v1>>v2; i=LocateVex_MG(G,v1); j=LocateVex_MG(G,v2); } G.edges[j][i]=G.edges[i][j]; }}void BFSTraverse(MGraph G) //广度优先遍历{ SqQueue Q;int v;for(v=0;v<G.vexnum;++v) visited[v]=FALSE; InitQueue_Sq(Q); cout<<"按广度优先遍历顺序顶点依次输出为:\n";for(v=0;v<G.vexnum;++v)if(!visited[v]) { visited[v]=TRUE; cout<<G.vexs[v]<<""; EnQueue_Sq(Q,v);while(Q.front!=Q.rear) { DeQueue_Sq(Q);for(int w=0;w<G.vexnum;w++)if(G.edges[v][w]&&(!visited[w])) { visited[w]=TRUE; cout<<G.vexs[w]<<""; EnQueue_Sq(Q,w); } } } cout<<endl;}void main(){ MGraph G; CreatUDG_MG(G); BFSTraverse(G);}
掌握基本的排序方法
上机内容:给定一组整数,分别 用直接插入排序、冒泡排序方法进行排序 ,输出排序后的结果
#include<iostream.h>#define MAXSIZE 20 //假设文件长度 ,即待排序记录数目typedef int KeyType; // 假设的关键字类型typedef int InfoType;typedef struct { //记录定义 KeyType key; //关键字型 InfoType otherinfo; //其他数据项,InfoType依赖于具体应用}RedType; //记录类型typedef struct { //顺序表定义 RedType r[MAXSIZE+1]; //r[0]闲置或用来做小兵int length; //顺序表长度 }SqList; //顺序表类型 void input(SqList &l){ cout<<"请输入各元素"<<endl;for(int i=1;i<=l.length;i++) { cin>>l.r[i].key; }}void Insertsort(SqList &L){ //对顺序表进行直接插入排序 int i,j;for(i=2;i<=L.length;i++) //外循环if(L.r[i].key<L.r[i-1].key) { //将L.r[i]插入有序子表 L.r[0]=L.r[i]; for(j=i-1;L.r[0].key<L.r[j].key;j--) //内循环 L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0]; } //end if }//Insertsortvoid Bubblesord(SqList &L){int i,j;bool tag=0;for( i=1;(tag==0)&&(i<=L.length);++i) { tag=1;for(j=L.length-1;j>=i;--j)if(L.r[j+1].key<L.r[j].key) { L.r[0]=L.r[j+1];L.r[j+1]=L.r[j];L.r[j]=L.r[0];tag=0; }//end if }//end for}//Bubblesordint main(){ SqList L;int i,m; cout<<"请输入元素个数:"<<endl; cin>>m; L.length=m; input(L);/* 显示该顺序表 */ cout<<"\n该顺序表为"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;/* 进行直接插入排序 */ Insertsort(L); cout<<"直接插入法排序"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;/* 进行冒泡排序 */ Bubblesord(L); cout<<"进行冒泡排序"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;return0;}
理解静态查找操作方法
内容:(1) 建立一个静态查找表 (可只输入数据的关键字项) 。
(2) 分别用顺序查找和用折半查找方法查找给定关键字。
(3)分别统计在两种查找方法中的比较次数。
#include<iostream.h>typedef int KeyType;typedef int InfoType; typedef struct{ KeyType *k;int length;}SSTable; void Initlist_SSTable(SSTable &ST){ ST.length=6; ST.k=new KeyType[ST.length+1]; cout<<"请输入6个关键字:"<<endl;for(int i=1;i<=ST.length;i++) cin>>ST.k[i];} int Search_Seq(SSTable ST,KeyType k, int&n){ ST.k[0]=k;for(int i=ST.length;ST.k[i]!=k;--i)++n;return i;} int Search_Bin(SSTable ST,KeyType k,int&n){int low=0;int high=ST.length;while(low<=high){int mid=(low+high)/2;if(k==ST.k[mid])return mid;elseif(k<ST.k[mid]) high=mid-1;else low=mid+1; }return0;}void main(){ SSTable ST; Initlist_SSTable(ST); KeyType k; int n=0; cout<<"请输入需要查找的关键字:"<<endl; cin>>k; cout<<"顺序查找"<<endl; if(Search_Seq(ST,k,n)==0) cout<<"没有该元素。"<<endl;else cout<<k<<endl; cout<<"关键字在第 "<<Search_Seq(ST,k,n)<<" 位置。"<<endl; cout<<"查找比较次数为:"<<n-1<<endl; cout<<"折半查找"<<endl;if(Search_Bin(ST,k,n)==0) cout<<"没有该元素。"<<endl;else cout<<k<<endl; cout<<"关键字在第 "<<Search_Bin(ST,k,n)<<" 位置。"<<endl; cout<<"查找比较次数为:"<<n-1<<endl; }
排序
#include<iostream.h>#define MAXSIZE 20 //假设文件长度 ,即待排序记录数目typedef int KeyType; // 假设的关键字类型typedef int InfoType;typedef struct { //记录定义 KeyType key; //关键字型 InfoType otherinfo; //其他数据项,InfoType依赖于具体应用}RedType; //记录类型typedef struct { //顺序表定义 RedType r[MAXSIZE+1]; //r[0]闲置或用来做小兵int length; //顺序表长度 }SqList; //顺序表类型 void input(SqList &L) //输入顺序表{ cout<<"请输入各元素"<<endl;for(int i=1;i<=L.length;i++) { cin>>L.r[i].key; }}void Insertsort(SqList &L){ //对顺序表进行直接插入排序 int i,j;for(i=2;i<=L.length;i++) //外循环if(L.r[i].key<L.r[i-1].key) { //将L.r[i]插入有序子表 L.r[0]=L.r[i]; for(j=i-1;L.r[0].key<L.r[j].key;j--) //内循环 L.r[j+1]=L.r[j]; //记录后移 L.r[j+1]=L.r[0]; } //end if }//Insertsortvoid Bubblesord(SqList &L){int i,j;bool tag=0;for( i=1;(tag==0)&&(i<=L.length);++i) { tag=1;for(j=L.length-1;j>=i;--j)if(L.r[j+1].key<L.r[j].key) { L.r[0]=L.r[j+1];L.r[j+1]=L.r[j];L.r[j]=L.r[0];tag=0; }//end if }//end for}//Bubblesordint main(){ SqList L;int i,m; cout<<"请输入元素个数:"<<endl; cin>>m; L.length=m; input(L);/* 显示该顺序表 */ cout<<"该顺序表为"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;/* 进行直接插入排序 */ Insertsort(L); cout<<"直接插入法排序"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;/* 进行冒泡排序 */ Bubblesord(L); cout<<"进行冒泡排序"<<endl;for(i=1;i<=L.length;i++) cout<<L.r[i].key<<""; cout<<endl;return0;}
冒泡、直插、快速比较算法,数据不是随即产生,手动输入的你可以做一个参考
//这个是对 冒泡、直插、快速的比较算法。数据不是随即产生的,是手动输入的,你可以做一个参考! 代码如下: #include <stdio.h>#include <stdlib.h>#define MAX 100void disparr();int a[MAX],n,m;void creatarr(){int i=0; printf("建立原始数序\n"); printf("\t 元素个数:"); scanf("%d",&n);while (i<n) { printf("\t 第%d个元素值:",i+1); scanf("%d",&a[i]); i++; }} int cmp(int lval, int rval,int order){if (order==1) { if (lval<rval) return (1);elsereturn (0); }else { if(lval>rval) return (1);elsereturn (0); }}void BubbleSort(int r[], int q, int w, int order){ int i=q ,j=w , k, swap;for (i=q ; i<w ; i++) { swap=0;for (j=q ; j<=w-q ; j++ )if(cmp(r[j+1], r[j], order)) { k=r[j+1]; r[j+1]=r[j]; r[j]=k; swap=1; }if (!swap) return; } printf("\n");if (q<i) BubbleSort (r, q,i-1, order);if (i<w) BubbleSort (r,j+1,w,order);}void insertsort(int x[],int l,int r,int order){int i=l,j=r,temp;for (i=1;i<=r;i++) { temp=x[i]; j=i-1;while (j>0&& cmp(temp, x[j], order)) { x[j+1]=x[j]; j--; } x[j+1]=temp; } printf("\n");if (l<i) BubbleSort (x, l,i-1, order);if (i<r) BubbleSort (x,j+1,r,order);}void quicksort(int x[],int l,int r,int order){int i=l,j=r,temp; temp=x[l];while (i<j) { while (i<j && cmp (temp, x[j],order)) j--;if (i<j) { x[i]=x[j]; i++; }while (i<j && cmp (x[i], temp, order)) i++;if (i<j) { x[j]=x[i]; j--; } } x[i]=temp;if (l<i) quicksort (x, l,i-1, order);if (i<r) quicksort (x,j+1,r,order);}void disparr(){int i;for (i=0;i<n;i++) printf("%d ",a[i]); printf("\n\n");}void main(){ int m; m=1; creatarr(a); printf("\n 原来的次序:"); disparr();while(m) {printf("*********************************************************************\n"); printf("0:退出 1:重新输入 2:直接插入排序 3:冒泡排序 4:快速排序 \n "); printf("**********************************************************************\n"); scanf("%d",&m);switch(m) { case0: exit(-1);case1: creatarr(a); printf("\n 原来的次序:"); disparr();break;case2: printf("直接插入排序:\n"); printf("从小到大排序:\n"); insertsort(a,0,n-2,1); printf("排序结果:"); disparr(); printf("从大到小排序:\n"); insertsort(a,0,n-2,0); printf("排序结果:"); disparr();break;case3: printf("冒泡排序法:\n"); printf("从小到大排序:\n"); BubbleSort(a,0,n-2,1); printf("排序结果:"); disparr(); printf("从大到小排序:\n"); BubbleSort(a,0,n-2,0); printf("排序结果:"); disparr();break;case4: printf("快速排序法:\n"); printf("从小到大排序:\n"); quicksort(a,0,n-1,1); printf("排序结果:"); disparr(); printf("从大到小排序:\n"); quicksort(a,0,n-1,0); printf("排序结果:"); disparr(); break; } }}
用系统计时器算时间复杂度
//用系统计时器算时间复杂度。 #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define LIST_INIT_SIZE 50000int bj1,yd1,n;clock_t start_t,end_t;typedef struct {int key; }ElemType;typedef struct { ElemType *elem;int length;}SqList;void addlist(SqList &L){int i;a: printf("请输入你要输入的个数:"); scanf("%d",&n);if(n>50000) { printf("超出范围重新输入!!!\n");goto a; } L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!L.elem)exit(0); L.length=0;for(i=1;i<n+1;i++) {b: L.elem[i].key=rand();if(L.elem[i].key>30000)goto b;++L.length; }}void SelectSort(SqList &L)//选择{ start_t=clock();int i,j,k,bj=0,yd=0;for(i=1;i<L.length;i++) { k=i;for(j=i+1;j<L.length;j++) { bj++;if(L.elem[j].key<L.elem[k].key)k=j; }if(i!=k) { L.elem[0].key=L.elem[i].key; L.elem[i].key=L.elem[k].key; L.elem[k].key=L.elem[0].key; yd+=3; } } end_t=clock(); printf("比较次数为 %d移动次数为 %d\n",bj,yd); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);}void qipao(SqList &L)//起泡{ start_t=clock();int i=1,j,bj=0,yd=0;while(i<L.length) {for(j=1;j<L.length;j++) { bj++;if(L.elem[j].key>L.elem[j+1].key) { L.elem[0].key=L.elem[j].key; L.elem[j].key=L.elem[j+1].key; L.elem[j+1].key=L.elem[0].key; yd+=3; } } i++; } end_t=clock(); printf("比较次数为 %d移动次数为 %d\n",bj,yd); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);}void InsertSort(SqList &L)//直接插入{ start_t=clock();int i,j,yd=0,bj=0;for(i=2;i<=L.length;i++) {if(L.elem[i].key<L.elem[i-1].key) { L.elem[0].key=L.elem[i].key; yd++; j=i-1; bj++;while(L.elem[0].key<L.elem[j].key) { L.elem[j+1].key=L.elem[j].key; j--; yd++; bj++; } L.elem[j+1].key=L.elem[0].key; yd++; } } end_t=clock(); printf("比较次数为 %d移动次数为 %d\n",bj,yd); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);}void xier(SqList &L)//希尔{ start_t=clock();int i,d=L.length/2,j,w=0,k,yd=0,bj=0;while(w<d) { w=1;for(i=w;i<L.length;i=i+d) { k=i;for(j=i+d;j<L.length;j=j+d) {if(L.elem[i].key>L.elem[j].key) { k=j; bj++; } }if(i!=k) { L.elem[0].key=L.elem[i].key; L.elem[i].key=L.elem[k].key; L.elem[k].key=L.elem[0].key; yd+=3; } w++; } d=d/2; w=1; } end_t=clock(); printf("比较次数为 %d移动次数为 %d\n",bj,yd); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);} void BeforeSort(){ yd1=0,bj1=0;}void display(int m,int n){ printf("比较次数为 %d移动次数为 %d\n",m,n);}int Partition(SqList &L,int low,int high)//快速排序 {int pivotkey; L.elem[0]=L.elem[low]; yd1++; pivotkey=L.elem[low].key;while (low<high) { yd1++;while(low<high&&L.elem[high].key>=pivotkey)--high; L.elem[low]=L.elem[high]; bj1++; yd1++;while (low<high&&L.elem[low].key<=pivotkey)++low; L.elem[high]=L.elem[low]; bj1++; yd1++; } L.elem[low]=L.elem[0]; yd1++;return low;}void QSort(SqList &L,int low,int high){ int pivotloc;if(low<high) { pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); }}void QuickSort(SqList &L){ start_t=clock(); BeforeSort(); QSort(L,1,L.length); display(yd1,bj1); end_t=clock(); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);}void Merge(ElemType R[],ElemType R1[],int low,int m,int high)//归并{int i=low, j=m+1, k=low;while(i<=m&&j<=high) {if(R[i].key<=R[j].key) { bj1++; R1[k]=R[i]; yd1++; i++; k++; }else { bj1++; R1[k]=R[j]; yd1++; j++; k++; } }while(i<=m) { R1[k]=R[i]; yd1++; i++; k++; }while(j<=high) { R1[k]=R[j]; yd1++; j++; k++; }}void MergePass(ElemType R[],ElemType R1[],int length, int n){ int i=0,j;while(i+2*length-1<n) { Merge(R,R1,i,i+length-1,i+2*length-1); i=i+2*length; }if(i+length-1<n-1) Merge(R,R1,i,i+length-1,n-1);elsefor(j=i;j<n;j++) R1[j]=R[j];}void MSort(ElemType R[],ElemType R1[],int n){ int length=1;while (length<n) { MergePass(R,R1,length,n); length=2*length; MergePass(R1,R,length,n); length=2*length; }}void MergeSort(SqList &L){ start_t=clock(); BeforeSort(); MSort(L.elem,L.elem,L.length); display(yd1,bj1); end_t=clock(); printf("排序用时为 %f\n",float(end_t-start_t)/CLK_TCK);} void main(){ SqList L; addlist(L); printf("起泡排序: \n"); qipao(L); addlist(L); printf("直插排序: \n"); InsertSort(L); addlist(L); printf("选择排序: \n"); SelectSort(L); addlist(L); printf("希尔排序: \n"); xier(L); addlist(L); printf("快速排续: \n"); QuickSort(L); addlist(L); printf("归并排序: \n"); MergeSort(L);}
下面附加一下基本的顺序表和链表的操作
/* 设一个递增有序顺序表L,将x插入L中,使L仍有序。*/#include <iostream>usingnamespace std;#define INITSIZE 100typedef int ElemType; typedef struct{ ElemType *elem;int initsize;int length;}SqList; void CreatSL(SqList &L,int n){ L.elem=new ElemType[INITSIZE]; L.initsize=INITSIZE; L.length=n; cout<<"请按从小到大输入顺序表的元素:"<<endl; for(int i=0;i<L.length;i++) cin>>L.elem[i]; cout<<"所创建的递增有序的顺序表为:"<<endl; for(int j=0;j<L.length;j++) cout<<L.elem[j]<<""; cout<<endl;}void Insert(SqList L,ElemType e){int i=0;while((i<L.length)&&(L.elem[i]<=e)) i++;if(i<L.length) {for(int j=L.length;j>i;j--)//用法一 L.elem[j]=L.elem[j-1]; L.elem[i]=e;/*//用法二 for(int j=L.length-1;j>i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i]=e;*/ }else L.elem[L.length]=e; L.length=L.length+1; cout<<"插入后的顺序表为:"<<endl;for(int k=0;k<L.length;k++) { cout<<L.elem[k]<<""; } cout<<endl;} void main(){ int n; ElemType e; SqList L; cout<<"请输入顺序表的元素个数:"; cout<<endl; cin>>n; CreatSL(L,n); cout<<"请输入要插入的元素:"; cin>>e; Insert(L,e);}
/* 设一个递减有序顺序表L,将x插入L中,使L仍有序。*/#include <iostream>usingnamespace std;#define INITSIZE 100typedef int ElemType;typedef struct{ ElemType *elem;int initsize;int length;}SqList;void CreatSL(SqList &L,int n){ L.elem=new ElemType[INITSIZE]; L.initsize=INITSIZE; L.length=n; cout<<"请按从大到小输入顺序表的元素:";for(int i=0;i<L.length;i++) cin>>L.elem[i]; cout<<"所创建的递减有序的顺序表为:";for(int j=0;j<L.length;j++) cout<<L.elem[j]<<""; cout<<endl;}void Insert(SqList L,ElemType e){int i=0;while((i<L.length)&&(L.elem[i]>=e)) i++;if(i<L.length) {for(int j=L.length;j>i;j--)//用法一 L.elem[j]=L.elem[j-1]; L.elem[i]=e;/*//用法二 for(int j=L.length-1;j>i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i]=e;*/ }else L.elem[L.length]=e; L.length=L.length+1; cout<<"插入后的顺序表为:";for(int k=0;k<L.length;k++) { cout<<L.elem[k]<<""; } cout<<endl;}void main(){int n; ElemType e; SqList L; cout<<"请输入顺序表的元素个数:"; cin>>n; CreatSL(L,n); cout<<"请输入要插入的元素:"; cin>>e; Insert(L,e);}
/*2.11 ①设A和B是两个递增有序的单链表,把他们归并成一个递减有序的单链表C,②并要求辅助空间为O(1)。(这道题处于极度变态的边沿中,让我怀疑它还是题目吗,还是题目有误。我个人认为,条件①和条件②,不能同时达成,要把两个递增的有序表合并成一个递减的有序链表则辅助空间就不可能为O(1)。辅助空间要为O(1)的话就只能合并成递增的有序表,这纯属我个人研究结果,要是哪位做得出来两个条件都符合的话,记得告诉我一下啊!)以下代码为:把两个递增有序的链表归并为一个递减有序链表*/#include<iostream>usingnamespace std;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList;void CreatList(LinkList &L,int n) //创立链表{ LinkList p,q; L=new LNode; L->next=NULL; q=L; cout<<"请从小到大输入链表的元素:";for(int i=1;i<=n;i++) { p=new LNode; cin>>p->data; p->next=q->next; q->next=p; q=q->next; } cout<<"所创建得的递增有序链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void CreatC(LinkList &A,LinkList &B,LinkList &C,int n) //合并链表{ C=new LNode; C->next=NULL; LinkList p,q,t; p=A->next; q=B->next;while(p&&q) { t=new LNode;if(p->data<=q->data) { t->data=p->data; p=p->next; }else { t->data=q->data; q=q->next; } t->next=C->next; C->next=t; }while(p) { t=new LNode; t->data=p->data; t->next=C->next; C->next=t; p=p->next; }while(q) { t=new LNode; t->data=q->data; t->next=C->next; C->next=t; q=q->next; } cout<<"合并后的递减有序链表为:"; p=C->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void main(){ LinkList A,B,C;int n,m,k; cout<<"请输入链表***A***的长度:"; cin>>n; CreatList(A,n); cout<<"请输入链表***B***的长度:"; cin>>m; CreatList(B,m); k=m+n; CreatC(A,B,C,k); }
/* 2.11 ①设A和B是两个递增有序的单链表,把他们归并成一个递减有序的单链表C,②并要求辅助空间为O(1)。(这道题处于极度变态的边沿中,让我怀疑它还是题目吗,还是题目有误。我个人认为,条件①和条件②,不能同时达成,要把两个递增的有序表合并成一个递减的有序链表则辅助空间就不可能为O(1)。辅助空间要为O(1)的话就只能合并成递增的有序表,这纯属我个人研究结果,要是哪位做得出来两个条件都符合的话,记得告诉我一下啊!)*///以下代码为:把两个递增有序的单链表归并为一个递增有序的链表,辅助空间为O(1)#include<iostream>usingnamespace std;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList;void CreatList(LinkList &L,int n) //创立链表{ LinkList p,q; L=new LNode; L->next=NULL; q=L; cout<<"请从小到大输入链表的元素:";for(int i=1;i<=n;i++) { p=new LNode; cin>>p->data; p->next=q->next; q->next=p; q=q->next; } cout<<"所创建得的递增有序链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void CreatC(LinkList &A,LinkList &B,LinkList &C,int n) //合并链表{ LinkList p,q,t; p=A->next; q=B->next; C=t=A;while(p&&q) {if(p->data<=q->data) { t->next=p; t=p; p=p->next; }else { t->next=q; t=q; q=q->next; } } t->next=p?p:q; delete B; cout<<"合并后的递增有序链表为:"; p=C->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;} void main(){ LinkList A,B,C;int n,m,k; cout<<"请输入链表***A***的长度:"; cin>>n; CreatList(A,n); cout<<"请输入链表***B***的长度:"; cin>>m; CreatList(B,m); k=m+n; CreatC(A,B,C,k); }
/* 2.12 设L是递增有序单链表,删除其中大于min且小于max的元素结点,并释放结点空间。(有点部分和上次那份上机题的那道C卷的不一样,用法简单一点,大家看一下)*/ #include<iostream>usingnamespace std;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode *LinkList;void CreatList(LinkList &L,int n){ LinkList p,q; L=new LNode; L->next=NULL; q=L; cout<<"请从小到大输入链表的元素:\n";for(int i=1;i<=n;i++) { p=new LNode; cin>>p->data; p->next=q->next; q->next=p; q=q->next; } cout<<"所创建得的递增有序链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void Find(LinkList &L,ElemType min,ElemType max,int n){ LinkList p,t; p=L;while(p->next) { if((p->next->data>min)&&(p->next->data<max)) { t=p->next; p->next=t->next; delete t; n--; }else { p=p->next; } } cout<<"操作后的递增有序链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void main(){ LinkList L;int n; ElemType min,max; cout<<"请输入链表的长度:"; cin>>n; CreatList(L,n); cout<<"请输入min的值:"; cin>>min; cout<<"请输入max的值:"; cin>>max; Find(L,min,max,n);}
/* 2.13 将单链表中值重复的结点删除,使所得的单链表中各结点值均不同。*/#include<iostream>usingnamespace std;typedef int ElemType;typedef struct LNode{ ElemType data;struct LNode *next;}LNode;typedef LNode* LinkList;void CreatLN(LinkList &L,int n){ L=new LNode; L->next=NULL; LinkList p,q; q=L; cout<<"请输入链表元素:";for(int i=1;i<=n;i++) { p=new LNode; cin>>p->data; p->next=q->next; q->next=p; q=q->next; } cout<<"创建的单链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void delet(LinkList &L,int n){ LinkList p,q,t,w; p=L->next;while(p) { t=p; q=p->next;while(q) {if(p->data!=q->data) {q=q->next;t=t->next;}else { w=q; t->next=q->next; q=t->next; delete w; n--; } } p=p->next; } cout<<"删除相同结点后的单链表为:"; p=L->next;for(int j=1;j<=n;j++) { cout<<p->data<<""; p=p->next; } cout<<endl;}void main(){ LinkList L;int n; cout<<"请输入链表的元素个数:"; cin>>n; CreatLN(L,n); delet(L,n);}
/*建立一个数据为整数的单链表L,然后将该链表中的数据域值最小的那个结点移到链表的最前端第一步:建立一个单链表第2: 显示该单链表第3: 查找链表中数据域最小的值,并将它移到到链表的最前端第4: 显示该单链表 */ #include <iostream>usingnamespace std; #define LIST_INIT_SIZE 100 //存储空间初始分配量#define LIST_INCREMENT 10 //存储空间增补量/*线性表方法类*/typedef int ElemType;typedef struct LNode{ ElemType data; //struct LNode *next; //}LNode; typedef LNode *LinkList; // void InitList_L(LinkList &L,int n){//构造空单链表L LinkList p; L=new LNode; L->next=NULL; cout<<"请输入您要输入的数据(逆序):\n";for(int i=0;i<n;++i){ p=new LNode; cin>>p->data; p->next=L->next; L->next=p; }} //InitList_L void PrintList(LinkList L){ LinkList p; cout<<"你输入的数据输出为:\n"; p=L->next;while(p) { cout<<p->data<<""; p=p->next; }} void FindList(LinkList L){ LinkList o,p,q; p=L->next; o=L->next;int n=p->data;while(p) {if(n>p->data) { n=p->data; q=p; } p=p->next; } cout<<"\n链表中最小的结点数据域值为:\n"; cout<<n<<endl; cout<<"链表中最小的结点移到链表的最前端链表输出为:\n"; cout<<n<<"";while(o) {if(o->data==n) { LNode *q=o;o=q->next; delete q; }else { cout<<o->data<<""; o=o->next; } } } void main(){int n; LinkList L; cout<<"请输入链表中元素的个数:\n"; cin>>n; InitList_L(L,n); PrintList(L); FindList(L); cout<<endl;}
附加:常用数据结构
数组 (Array)
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,
数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
栈 (Stack)
是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
队列 (Queue)
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
链表 (Linked List)
是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
树 (Tree)
是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:
(1)有且仅有一个结点
k0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。
(2)除K0外,k中的每个结点,对于关系N来说有且仅有一个前驱。
(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
图 (Graph)
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。
堆 (Heap)
在计算机科学中,堆是一种特殊的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
散列表 (Hash)
若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为
后记
具体我就不调试结果出来了,要想知道结果怎么样,还得大家自己回去按照代码编程一遍,编写不对或者有其他问题可以留言交流,谢谢大家了!!!
参考:
严蔚敏,吴伟民编著图书 ---《数据结构与算法》
百度百科——数据结构
作者:类菌体
出处:http://www.cnblogs.com/bacteroid/archive/2011/07/31/2122910.html
关于作者:在校学生
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接
如有问题,可以通过303323670@qq.com 联系我,非常感谢。
转载于:https://www.cnblogs.com/bacteroid/archive/2011/07/31/2122910.html
总结大学一些常见数据结构简单实现(cc++语言)相关推荐
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 获取用户列表为空_数据结构和算法(Golang实现)(15)常见数据结构-列表
列表 一.列表 List 我们又经常听到 列表 List 数据结构,其实这只是更宏观的统称,表示存放数据的队列. 列表 List:存放数据,数据按顺序排列,可以依次入队和出队,有序号关系,可以取出某序 ...
- 实现根据条件删除_常见数据结构的实现(一):跳跃表
知乎的小伙伴们好,这是我在知乎写的第一篇文章哈.我写这篇文章的目的主要是和大家分享一些想法,交流学习一下. 这系列的文章是分析常见数据结构的实现,包括跳跃表.二叉堆.前缀树.红黑树等等...数据结构这 ...
- 常见数据结构与算法整理总结(下)
原文链接:https://www.jianshu.com/p/42f81846c0fb 这篇文章是常见数据结构与算法整理总结的下篇,上一篇主要是对常见的数据结构进行集中总结,这篇主要是总结一些常见的算 ...
- 【面试经典】redis 常见数据结构以及使用场景分析
1.String 常用命令: set,get,decr,incr,mget 等. String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字. 常规key- ...
- 图解!24 张图彻底弄懂九大常见数据结构!
作者 | Amazing10 责编 | 屠敏 数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一.数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合 ...
- 笔记整理4----Java语言高级(四)16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级
16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级 第05天 API 今日内容介绍 Object类 & System类 ...
- Java基础 常见数据结构与算法 项目总结
Java基础 1 Java基础必知必会 1.1 Java语言有哪些特点? 面向对象(封装,继承,多态): 平台无关性,平台无关性的具体表现在于,Java 是"一次编写,到处运行(Write ...
- 搜索中常见数据结构与算法探究(二)
本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫:读者可以通过比较几种算法的差异,进一步了解匹配算法演进过程以及解决问题的场景:KMP算 ...
- 搜索中常见数据结构与算法探究(一)
1 前言 ES现在已经被广泛的使用在日常的搜索中,Lucene作为它的内核值得我们深入研究,比如FST,下面就用两篇分享来介绍一些本文的主题: - 第一篇主要介绍数据结构和算法基础和分析方法,以及一些 ...
最新文章
- 如何禁止用户连续点击一个按钮事件详细JS
- 简述python程序结构_python架构的概念讲解
- Linux 系统之软件管理
- JMeter篇01:JMeter在Mac下的安装
- 阿里云欧洲数据中心开放运营:与沃达丰达成战略合作
- MySQL month()函数
- CVPR 2021 论文/代码分类汇总!持续更新中!
- mysql索引linke和等于_MySQL索引怎么用?秒懂只需四个点!
- 单片机c语言指针赋地址,[转载]单片机c语言指针和取地址以及类型转换
- 一个鼠标键盘控制两台甚至多台主机的方法(软件亲测可用)
- “华为杯”第17届中国研究生数学建模竞赛B题二等奖论文
- 瓦尔德-沃尔福威茨检验
- 没有更改计算机日期权限,修改电脑时间_修改电脑时间没有权限
- 微信3.1.0.67逆向-微信3.1.0.67HOOK接口(WeChatHelper3.1.0.67.dll)使用说明
- 付费上班,你听说过吗?
- 基于JAVA毕业生交流学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
- 实变函数—有限覆盖定理的证明
- a href点击无效_a标签失效的问题
- 使用scrapy爬取手机版斗鱼主播的房间图片及昵称
- XMind软件非试用版本下载(亲测有效)
热门文章
- (译)cocos2d精灵教程:第三部分
- 在DOS中使用系统还原工具
- 查找丢包故障点的一个好命令:pathping
- 为什么 Nginx 比 Apache 更牛叉?
- 你这几天因为 YYYY-MM-dd 被提 BUG 了吗??
- Oracle 或关闭中国研发中心(CDC):裁员 1600 人
- 28款GitHub最流行的开源机器学习项目
- 重磅 | 阿里云启动AliSQL邀测,性能比MySQL提升70%,秒杀场景提升百倍
- 一天能写2000行代码的实习生,到底是不是一个程序员的好苗子?
- android侧边栏点击,侧边菜单栏 android-menudrawer