數(shù)據(jù)結構基礎

算法基礎部分

算法是對特定問題求解步驟的一種描述嫡锌,算法是指令的有限序列伪冰,其中每一條指令表示一個或多個操作繁疤。
算法具有以下5個屬性:

  • 有窮性:一個算法必須總是在執(zhí)行有窮步之后結束钠惩,且每一步都在有窮時間內完成。
  • 確定性:算法中每一條指令必須有確切的含義苞笨。不存在二義性债朵。只有一個入口和一個出口
  • 可行性:一個算法是可行的就是算法描述的操作是可以通過已經實現(xiàn)的基本運算執(zhí)行有限次來實現(xiàn)的。
  • 輸入:一個算法有零個或多個輸入,這些輸入取自于某個特定對象的集合。
  • 輸出:一個算法有一個或多個輸出丁恭,這些輸出同輸入有著某些特定關系的量。
所以對應的算法設計的要求:
  • 正確性:算法應滿足具體問題的需求谚中;
  • 可讀性:算法應該好讀,以有利于讀者對程序的理解寥枝;
  • 健壯性:算法應具有容錯處理宪塔,當輸入為非法數(shù)據(jù)時,算法應對- 其作出反應囊拜,而不是產生莫名其妙的輸出結果某筐。
  • 效率與存儲量需求:效率指的是算法執(zhí)行的時間;存儲量需求指算法執(zhí)行過程中所需要的最大存儲空間艾疟。一般這兩者與問題的規(guī)模有關来吩。
順序表:
  • 線性表(a1敢辩,a2…蔽莱,an)有唯一的第一個和最后一個元素(n≥0)。其余的有唯一的前驅和后繼戚长。
  • 順序表定義:用一組地址連續(xù)的存儲單元依次存放的數(shù)據(jù)元素盗冷。
    在順序表的第i個位置前插入一個數(shù)據(jù)元素,需要向后移動n - i +1個元素同廉,刪除第i個位置的元素需要向前移動n- i個元素仪糖。
#include <stdio.h>
#include <malloc.h> 
typedef char ElemType;
typedef struct 
{
    ElemType data[MAX_SIZE];
    int len;
}SqList;
//初始化順序表
void initList(SqList *&L)
{
    L=(SqList *)malloc(sizeof(SqList));
    L->len=0;
}
//插入元素
void insertList(SqList *&L,int i,ElemType e)
{
    i--;
    int j;
    for(j=L->len;j>i;j--)
        L->data[j]=L->data[j-1];
    L->data[i]=e;
    L->len++;
}
//刪除第i個位置的元素
void deleteList(SqList *&L,int i)
{
    i--;
    ElemType e=L->data[i];
    for(int j=i;j<L->len-1;j++)
        L->data[j]=L->data[j+1];
    L->len--;
    printf("%c",e);
}
//輸出元素
void disPlay(SqList *L)
{
    int i;
    for(i=0;i<;L->len;i++)
        printf("%c   ",L->data[i]);
}
//釋放順序表
void freeList(SqList *L)
{
    free(L);
}
  • 鏈表
    鏈表是一種物理存儲單元上非連續(xù)柑司、非順序的存儲結構,數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序實現(xiàn)的.
typedef char ElemType;
typedef struct  Node 
{
    ElemType data;
    struct Node *next;
}LinkList;
//初始化鏈表
void initLink(LinkList *&L)
{
    L=(LinkList *)malloc(sizeof(LinkList));
    L->next=NULL;
}
//鏈表插入
int insertLink(LinkList *&L,int i,ElemType e)
{
    LinkList *p=L,*s;
    int j=0;
    while(j<i-1 && p!=NULL)
    {
    j++;
    p=p->next;
    }
 
    if(p==NULL) return 0;
    else
    {
    s=(LinkList *)malloc(sizeof(LinkList));
    s->data=e;
    s->next=p->next;
    p->next=s;
    }
    return 1;
}
//刪除鏈表中元素
void deleteList(LinkList *L)
{
    LinkList *p=L,*q=p->next;
    while(q!=NULL)
    {
        free(p);
        p=q;
        q=p->next;
    }
}
//輸出鏈表
void disPlsy(LinkList *L)
{
    LinkList *p=L->next;
    while(p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
}
#define MAX_SIZE 100
typedef char ElemType;
typedef struct
{
    ElemType data[MAX_SIZE];
    int top;
}Stack;
//初始化棧
void initStack(Stack *&S)
{
    S=(Stack *)malloc(sizeof(Stack));
    S->top=-1;
}
//元素進棧
int push(Stack *&S,ElemType e)
{
    if(S->top==MAX_SIZE-1) return 0;
    S->top++;
    S->data[S->top]=e;
    return 1;
}
//出棧
int pop(Stack *&S)
{
    if(S->top==-1) return 0;
    ElemType e=S->data[S->top];
    S->top--;
    return e;
}
//輸出棧表
void disPlay(Stack *S)
{
    int i;
    for(i=S->top;i>=0;i--)
    printf("%c ",S->data[i]);
}
  • 隊列
#define MAXSIZE 10
typedef char ElemType;
typedef struct 
{
    ElemType data[MAXSIZE];
    int font,rear;
}Queue;
//初始化隊列
void initQueue(Queue *&Q)
{
    Q=(Queue *)malloc(sizeof(Queue));
    Q->font=Q->rear=0;
}
//入隊
int enQueue(Queue *&Q,ElemType e)
{
    if((Q->rear+1)%MAXSIZE==Q->font) return 0;
    Q->rear=(Q->rear+1)%MAXSIZE;
    Q->data[Q->rear]=e;
    return 1;
}
//出隊
void deQueue(Queue *&Q)
{
    ElemType e;
//  if(Q->font==Q->rear)  ;
    Q->font=(Q->font+1)%MAXSIZE;
    e=Q->data[Q->font];
    printf("%c ",e);
}
  • 二叉樹
typedef char ElemType;
typedef struct node
{
    ElemType data;
    struct node *left,*right;
}BTNode;
//建立二叉樹
void createBTNode(BTNode *&b,char *str)
{
    BTNode *St[MAX_SIZE],*p=NULL;
    int top=-1,k,i=0;
    char ch=str[i];
    b=NULL;
    while(ch!='\0')
    {
        switch(ch)
        {
        case '(':
                top++;
                St[top]=p;
                k=1;
                break;
        case ',':
                k=2;
                break;
        case ')':
                top--;
                break;
        default:
                p=(BTNode *)malloc(sizeof(BTNode));
                p->data=ch;
                p->left=p->right=NULL;
                if(b==NULL) b=p;
                else
                {
                    switch(k)
                    {
                    case 1:
                            St[top]->left=p;
                            break;
                    case 2:
                            St[top]->right=p;
                            break;
                    }
                }
        }
        i++;
        ch=str[i];
    }
}
//先序遍歷
void disPlay(BTNode *&b)
{
    if(b!=NULL)
    {
    printf("%c ",b->data);
    disPlay(b->left);
    disPlay(b->right);
    }
}
//先序遍歷的非遞歸方法
void preOrder(BTNode *b)
{
    BTNode *St[MAX_SIZE];
    BTNode *p;
    int top=-1;
    if(b!=NULL)
    {
        top++;
        St[top]=b;
        while(top>-1)
        {
            p=St[top];
            top--;
            printf("%c ",p->data);
            if(p->right!=NULL)
            {
                top++;
                St[top]=p->right;
            }
            if(p->left!=NULL)
            {
                top++;
                St[top]=p->left;
            }
        }
    }
}
#define MAX_SIZE 100
#include "queue"
typedef char VertexType;
typedef int EdgeType;
typedef enum {FALSE,TRUE} Boolean;
Boolean visited[MAX_SIZE];
typedef struct
{
VertexType verx[MAX_SIZE]; //頂點表
EdgeType edges[MAX_SIZE][MAX_SIZE];//鄰接矩陣
int n,e;//定點數(shù)和邊數(shù)
}MGraph;
 
void createMGraph(MGraph &G)
{
    int i,j,k;
    char ch1,ch2;
    cout<<"請輸入頂點數(shù)和邊數(shù):"<<endl;
    cin>>G.n;
    cin>>G.e;
    for(i=0;i<G.n;i++)
    for(j=0;j<G.n;j++)
    G.edges[i][j]=0;
    cout<<"請輸入頂點信息";
    for(i=0;i<G.n;i++)
    cin>>G.verx[i];
    cout<<"請輸入變的信息:"<<endl;
    for(k=0;k<G.e;k++)
    {
    cin>>ch1>>ch2;
    for(i=0;ch1!=G.verx[i];i++);
    for(j=0;ch2!=G.verx[j];j++);
    G.edges[i][j]=1;
    }
}
 
void DFSM(MGraph &G,int i)  
{  
    int j;  
    printf("深度優(yōu)先遍歷結點: 結點%c/n",G.verx[i]);   //訪問頂點vi  
    visited[i]=TRUE;          
    for(j=0;j<G.n;j++)           //依次搜索vi鄰接點  
    if(G.edges[i][j]==1 && !visited[j])  
    DFSM(G,j);  
}  
void DFSTraverseM(MGraph &G)  
{  
    int i;  
    for(i=0;i<G.n;i++)  
    visited[i]=FALSE;     
    for(i=0;i<G.n;i++)
    if(!visited[i])
    DFSM(G,i);
}  
 
void BFSM(MGraph &G,int i)
{
    queue<char> charqueue;
    visited[i]=TRUE;
    int j;
    printf("%c ",G.verx[i]);
    charqueue.push(i);
    while(!charqueue.empty())
    {
        charqueue.pop();
        j=G.verx[i];
        for(int k=0;k<G.n;k++)
        if(G.edges[j][k]==1 && !visited[k])
        {
            printf("%c ",G.verx[k]);
            visited[i]=TRUE;
            charqueue.push(G.verx[k]);
        }
    }
}
 
void BFSTraverseM(MGraph &G)  
{  
    int i;  
    for(i=0;i<G.n;i++)  
    visited[i]=FALSE;     
    for(i=0;i<G.n;i++)
    if(!visited[i])
    BFSM(G,i);
}
  • 查找

  • 排序

//插入排序
void insertSort(int *num,int n)
{
    int i,j,temp;
    for(i=1;i<n;i++)
    {
         j=i;
         temp=num[j];
         while(j>0 && num[j-1]>temp)
             {
              num[j]=num[j-1];
              j--;
             }
         num[j]=temp;
    }
}
//冒泡排序
void bollSort(int * num,int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
        for(j=n-1;j>=i;j--)
        {
            if(num[j]<num[j-1])
            {
            temp=num[j];
            num[j]=num[j-1];
            num[j-1]=temp;
            }
        }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锅劝,一起剝皮案震驚了整個濱河市攒驰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌故爵,老刑警劉巖玻粪,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诬垂,居然都是意外死亡劲室,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門结窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來很洋,“玉大人,你說我怎么就攤上這事隧枫『泶牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵官脓,是天一觀的道長线定。 經常有香客問我,道長确买,這世上最難降的妖魔是什么斤讥? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮湾趾,結果婚禮上芭商,老公的妹妹穿的比我還像新娘。我一直安慰自己搀缠,他們只是感情好铛楣,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艺普,像睡著了一般簸州。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歧譬,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天岸浑,我揣著相機與錄音,去河邊找鬼瑰步。 笑死矢洲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的缩焦。 我是一名探鬼主播读虏,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼责静,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盖桥?” 一聲冷哼從身側響起灾螃,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎揩徊,沒想到半個月后睦焕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡靴拱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年垃喊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袜炕。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡本谜,死狀恐怖,靈堂內的尸體忽然破棺而出偎窘,到底是詐尸還是另有隱情乌助,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布陌知,位于F島的核電站他托,受9級特大地震影響,放射性物質發(fā)生泄漏仆葡。R本人自食惡果不足惜赏参,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沿盅。 院中可真熱鬧把篓,春花似錦、人聲如沸腰涧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窖铡。三九已至疗锐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間费彼,已是汗流浹背滑臊。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敌买,地道東北人简珠。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像虹钮,于是被迫代替她去往敵國和親聋庵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內容