表捎稚、棧、隊(duì)列的C語(yǔ)言實(shí)現(xiàn)(指針實(shí)現(xiàn))

數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式今野。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合葡公。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來(lái)更高的運(yùn)行或者存儲(chǔ)效率条霜。數(shù)據(jù)結(jié)構(gòu)往往同高效的檢索算法索引技術(shù)有關(guān)催什。

希望大家喜歡,點(diǎn)贊哦

鏈表的實(shí)現(xiàn):

鏈表list.h 接口頭文件

/* list.h -- 簡(jiǎn)單列表類(lèi)型的頭文件 */
#ifndef LIST_H_
#define LIST_H_
#include <stdbool.h>     /* C99 特性         */
//需要保存的數(shù)據(jù)類(lèi)型
struct data_type
{
    char c;
    int i;
    //寫(xiě)出想要表示的數(shù)據(jù)即可宰睡。蒲凶。。
}

//一般類(lèi)型定義
typedef struct data_type Item;

/*在鏈表的實(shí)現(xiàn)中拆内,每一個(gè)鏈接被稱(chēng)為一個(gè)節(jié)點(diǎn)(node)旋圆。每個(gè)節(jié)點(diǎn)包含形成列表內(nèi)容的信息和指向下一節(jié)點(diǎn)的指針*/
typedef struct node
{
    Item item;
    struct node * next;
} Node;

//為了管理列表,需要一個(gè)指向其開(kāi)始處的指針
typedef Node * List;

/* 函數(shù)原型 */

/* 操作:初始化一個(gè)列表: */
void InitializeList(List * plist);

/* 操作:確定列表是否為空列表 */
bool ListIsEmpty(const List *plist); 

/* 操作:確定列表是否已滿(mǎn) */
bool ListIsFull(const List *plist);

/* 操作:確定列表中項(xiàng)目的個(gè)數(shù) */
unsigned int ListItemCount(const List *plist);

/* 操作:在列表尾部添加一個(gè)項(xiàng)目 */
bool AddItem(Item item, List * plist);

/* 操作:把一個(gè)函數(shù)作用于列表的每個(gè)項(xiàng)目 */
void Traverse (const List *plist, void (* pfun)(Item item) );

/* 操作:釋放已分配的內(nèi)存(如果有) */
void EmptyTheList(List * plist);

#endif

list.c 實(shí)現(xiàn)文件

/* list.c -- 支持列表操作的功能  */
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

/* 局部函數(shù)原型 */
static void CopyToNode(Item item, Node * pnode);

/* 接口函數(shù)   */

/* 初始化一個(gè)列表 */
void InitializeList(List * plist)
{
    * plist = NULL;
}

/* 如果列表為空則返回真 */
bool ListIsEmpty(const List * plist)
{
    if (*plist == NULL)
        return true;
    else
        return false;
}

/* 如果列表已滿(mǎn)則返回真 */
bool ListIsFull(const List * plist)
{
    Node * pt;
    bool full;

    pt = (Node *) malloc(sizeof(Node));
    if (pt == NULL)
        full = true;
    else
        full = false;
    free(pt);
 
    return full;
}

/* 返回節(jié)點(diǎn)數(shù) */
unsigned int ListItemCount(const List * plist)
{
    unsigned int count = 0;
    Node * pnode = *plist;    /* set to start of list */

    while (pnode != NULL)
    {
        ++count;
        pnode = pnode->next;  /* set to next node     */
    }
    
    return count;
} 

/* 創(chuàng)建存放項(xiàng)目的節(jié)點(diǎn)麸恍,并把它添加到有plist指向的列表尾部 */
bool AddItem(Item item, List * plist)
{
    Node * pnew;
    Node * scan = *plist;

    pnew = (Node *) malloc(sizeof(Node));
    if (pnew == NULL)
        return false;     /* quit function on failure  */

    CopyToNode(item, pnew);
    pnew->next = NULL;
    if (scan == NULL)          /* empty list, so place */
        *plist = pnew;         /* pnew at head of list */
    else
    {
        while (scan->next != NULL)
            scan = scan->next;  /* find end of list    */
        scan->next = pnew;      /* add pnew to end     */
    }
   
    return true;
}

/* 訪問(wèn)每個(gè)節(jié)點(diǎn)并對(duì)他們分別執(zhí)行由pfun指向的函數(shù) */
void Traverse  (const List * plist, void (* pfun)(Item item) )
{
    Node * pnode = *plist;    /* set to start of list   */

    while (pnode != NULL)
    {
        (*pfun)(pnode->item); /* apply function to item */
        pnode = pnode->next;  /* advance to next item   */
    }
}

/* 釋放由malloc()分配的內(nèi)存灵巧,把列表指針設(shè)置為NULL */
void EmptyTheList(List * plist)
{
    Node * psave;

    while (*plist != NULL)
    {
        psave = (*plist)->next; /* save address of next node */
        free(*plist);           /* free current node         */
        *plist = psave;         /* advance to next node      */
    }
}

/* 局部函數(shù)定義  */
/* 把一個(gè)項(xiàng)目復(fù)制到節(jié)點(diǎn)中 */
static void CopyToNode(Item item, Node * pnode)
{
    pnode->item = item;  /* structure copy */
}

棧的實(shí)現(xiàn):

棧 stack.h 接口頭文件

#ifndef STACK_H_
#define STACK_H_
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty( Stack S );
Stack CreateStack( void );
void DisposeStack( Stack S );
void MakeEmpty( Stack S );
void Push( ElementType X, Stack S );
ElementType Top( Stack S );
void Pop( Stack S );

#endif

stack.c 實(shí)現(xiàn)文件

#include "stack.h"
#include "fatal.h"
struct Node
{
    ElementType Element;
    PtrToNode   Next;
}

int IsEmpty( Stack S )
{
    return S->Next ==NULL;
}

Stack CreateStack( void )
{
    Stack S;
    
    S=malloc (sizeof(struct Node));
    if(S==NULL)
        FatalError( "Out of space!!!" );
    S->Next = NULL;
    MakeEmpty(S);
    return S;
}

void MakeEmpty( Stack S )
{
    if (S==NULL)
        Error( "Must use CreateStack first" );
    else
        while(!IsEmpty(S))
        Pop(S);
}

void Stack (Stack S)
{
    MakeEmpty(S);
    free(S);
}

void Push( ElementType X, Stack S )
{
    PtrToNode TmpCell;
    TmpCell = malloc( sizeof( struct Node ) );
    if( TmpCell == NULL )
        FatalError( "Out of space!!!" );
    else
    {
        TmpCell->Element = X;
        TmpCell->Next = S->Next;
        S->Next = TmpCell;
    }
}

ElementType Top( Stack S )
{
    if( !IsEmpty( S ) )
        return S->Next->Element;
    Error( "Empty stack" );
        return 0;  /* Return value used to avoid warning */
}

void Pop( Stack S )
{
        PtrToNode FirstCell;
        if( IsEmpty( S ) )
            Error( "Empty stack" );
        else
        {
            FirstCell = S->Next;
            S->Next = S->Next->Next;
            free( FirstCell );
        }
}

隊(duì)列的實(shí)現(xiàn):

隊(duì)列queue.h 接口頭文件

        typedef int ElementType;
/* START: fig3_57.txt */
        #ifndef _Queue_h
        #define _Queue_h

        struct QueueRecord;
        typedef struct QueueRecord *Queue;

        int IsEmpty( Queue Q );
        int IsFull( Queue Q );
        Queue CreateQueue( int MaxElements );
        void DisposeQueue( Queue Q );
        void MakeEmpty( Queue Q );
        void Enqueue( ElementType X, Queue Q );
        ElementType Front( Queue Q );
        void Dequeue( Queue Q );
        ElementType FrontAndDequeue( Queue Q );

        #endif  /* _Queue_h */
/* END */

queue.c 實(shí)現(xiàn)文件

        #include "queue.h"
        #include "fatal.h"
        #include <stdlib.h>

        #define MinQueueSize ( 5 )

        struct QueueRecord
        {
            int Capacity;
            int Front;
            int Rear;
            int Size;
            ElementType *Array;
        };

/* START: fig3_58.txt */
        int
        IsEmpty( Queue Q )
        {
            return Q->Size == 0;
        }
/* END */

        int
        IsFull( Queue Q )
        {
            return Q->Size == Q->Capacity;
        }

        Queue
        CreateQueue( int MaxElements )
        {
            Queue Q;

/* 1*/      if( MaxElements < MinQueueSize )
/* 2*/          Error( "Queue size is too small" );

/* 3*/      Q = malloc( sizeof( struct QueueRecord ) );
/* 4*/      if( Q == NULL )
/* 5*/          FatalError( "Out of space!!!" );

/* 6*/      Q->Array = malloc( sizeof( ElementType ) * MaxElements );
/* 7*/      if( Q->Array == NULL )
/* 8*/          FatalError( "Out of space!!!" );
/* 9*/      Q->Capacity = MaxElements;
/*10*/      MakeEmpty( Q );

/*11*/      return Q;
        }

/* START: fig3_59.txt */
        void
        MakeEmpty( Queue Q )
        {
            Q->Size = 0;
            Q->Front = 1;
            Q->Rear = 0;
        }
/* END */

        void
        DisposeQueue( Queue Q )
        {
            if( Q != NULL )
            {
                free( Q->Array );
                free( Q );
            }
        }

/* START: fig3_60.txt */

        static int
        Succ( int Value, Queue Q )
        {
            if( ++Value == Q->Capacity )
                Value = 0;
            return Value;
        }

        void
        Enqueue( ElementType X, Queue Q )
        {
            if( IsFull( Q ) )
                Error( "Full queue" );
            else
            {
                Q->Size++;
                Q->Rear = Succ( Q->Rear, Q );
                Q->Array[ Q->Rear ] = X;
            }
        }
/* END */



        ElementType
        Front( Queue Q )
        {
            if( !IsEmpty( Q ) )
                return Q->Array[ Q->Front ];
            Error( "Empty queue" );
            return 0;  /* Return value used to avoid warning */
        }

        void
        Dequeue( Queue Q )
        {
            if( IsEmpty( Q ) )
                Error( "Empty queue" );
            else
            {
                Q->Size--;
                Q->Front = Succ( Q->Front, Q );
            }
        }

        ElementType
        FrontAndDequeue( Queue Q )
        {
            ElementType X = 0;

            if( IsEmpty( Q ) )
                Error( "Empty queue" );
            else
            {
                Q->Size--;
                X = Q->Array[ Q->Front ];
                Q->Front = Succ( Q->Front, Q );
            }
            return X;
        }

希望大家喜歡,點(diǎn)贊哦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末或南,一起剝皮案震驚了整個(gè)濱河市孩等,隨后出現(xiàn)的幾起案子艾君,更是在濱河造成了極大的恐慌采够,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰垄,死亡現(xiàn)場(chǎng)離奇詭異蹬癌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)虹茶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)逝薪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蝴罪,你說(shuō)我怎么就攤上這事董济。” “怎么了要门?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵虏肾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我欢搜,道長(zhǎng)封豪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任炒瘟,我火速辦了婚禮吹埠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己缘琅,他們只是感情好粘都,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著刷袍,像睡著了一般驯杜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上做个,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天鸽心,我揣著相機(jī)與錄音,去河邊找鬼居暖。 笑死顽频,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的太闺。 我是一名探鬼主播糯景,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼省骂!你這毒婦竟也來(lái)了蟀淮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钞澳,失蹤者是張志新(化名)和其女友劉穎怠惶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體轧粟,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡策治,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兰吟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片通惫。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖混蔼,靈堂內(nèi)的尸體忽然破棺而出履腋,到底是詐尸還是另有隱情,我是刑警寧澤惭嚣,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布遵湖,位于F島的核電站,受9級(jí)特大地震影響料按,放射性物質(zhì)發(fā)生泄漏奄侠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一载矿、第九天 我趴在偏房一處隱蔽的房頂上張望垄潮。 院中可真熱鬧烹卒,春花似錦、人聲如沸弯洗。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牡整。三九已至藐吮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逃贝,已是汗流浹背谣辞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沐扳,地道東北人泥从。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像沪摄,于是被迫代替她去往敵國(guó)和親躯嫉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,139評(píng)論 30 470
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用杨拐,...
    LZM輪回閱讀 3,309評(píng)論 0 6
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛(ài)閱讀 1,978評(píng)論 0 7
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,716評(píng)論 0 4
  • 多線程祈餐、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景哄陶。SDWebImage的原...
    LZM輪回閱讀 2,007評(píng)論 0 12