C語言之鏈表

來源:互聯網
上載者:User

標籤:標記   表示   next   ***   node   合法性   ber   number   pre   

 這兩天在複習C語言的知識,為了給下個階段學習OC做準備,以下的代碼的編譯運行環境是Xcode5.0版本,寫篇博文把昨天複習的C語言有關鏈表的知識給大家分享一下,以下是小菜自己總結的內容,代碼也是按照自己的思路所編寫的,有不足之處還請大牛們批評指教。

  確切的說鏈表屬於資料結構中線性表中的內容,在鏈表中儲存的內容是按線性排列的,就像是一條線把所要存的資料串起來,可以把鏈表類比成一串珠子,資料就是一個個的珠子,資料間的next指標就相當於穿珠子的線。

  鏈表操作的時間複雜度: 往鏈表中插入資料的時間複雜度為O(1)。

  想真正的理解鏈表及在C語言中的表示方法的前提是理解C語言中的指標和結構體,閑話少說,進代碼才是關鍵,代碼中基本上都有注釋

  1.用結構體定義鏈表的節點

1 //定義鏈表中的節點2 typedef struct node{3     //儲存資料4     int data;5     //指向下一個節點6     struct node *next;7 }Node;

 

  2.定義鏈表的整體結構,存放鏈表的節點和鏈表中的資訊

//定義鏈表結構typedef struct {    //存放前端節點    Node *head;    //記錄節點的個數    int count;}List;

  

  3.鏈表的初始化,給鏈表分配頭結點,節點個數初始化為0

/************************************************ *功能:初始化鏈表,分配頭結點,結點個數為0 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void initLinkList(List *list){    //給前端節點分配記憶體    list->head = malloc(sizeof(Node));    //頭結點的下一個節點為空白    list->head->next = NULL;    //總節點個數為0    list->count = 0;}

 

  4.建立單項鏈表,這裡為了簡單起見,把要存入資料先存入到array中,下面我是用逆序的方法來建立鏈表的,是從head節點後插入資料,也可以用順序建鏈表,從鏈表的後面插入資料

/************************************************ *功能:逆序建立鏈表,從頭結點後插入 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void createLinkList(List *list){    //建立鏈表用到的資料    int a[10] = {1,2,3,4,5,6,7,8,9,10};    //臨時節點指標用於分配節點記憶體    Node *p;    for (int i = 0; i < 10; i++)    {        //給新的節點分配記憶體        p = (Node *)malloc(sizeof(Node));        //給新節點賦值        p->data = a[i];        //把值加入到前端節點後面,逆序建立鏈表        p->next = list->head->next;        list->head->next = p;        //鏈表節點個數加一        list->count++;    }}

 

  5.為了方便查看鏈表中的值,需要一個列印鏈表中的資料的函數

/************************************************ *功能:列印鏈表中的值 *參數:鏈表指標 *Mr.li *日期:14-07-23 ************************************************/void printList(List *list){    //臨時節點指標變數    Node *p;    //從頭開始遍曆    p = list->head->next;    while (p != NULL)    {        //自訂的輸出整的函數        print(p->data);        p = p->next;    }    putchar(‘\n‘);}

 

  6.查詢元素在鏈表中對於的位置

/************************************************ *功能:尋找鏈表中指定值的位置,有的返還其位置,無,返還-1 *參數:鏈表指標,要尋找的值 *Mr.li *日期:14-07-23 ************************************************/int search(List *list, int obj){    //定義遊標指標    Node *p;    //標記值的位置    int local = 0;    p = list->head->next;    while (p != NULL)    {        local ++;        if (p->data == obj)        {            //傳回值的位置            return local;        }        p = p->next;    }    //值不存在返回-1    return -1;}

 

  7.刪除鏈表中的相應的資料

/************************************************ *功能:刪除鏈表中的值 *參數:鏈表指標,要刪除的值 *Mr.li *日期:14-07-23 ************************************************/void delete(List *list, int obj){    //查詢要刪除的元素是否在鏈表中,有返還相應的位置,沒有則返還-1    int flag = search(list, obj);        //判斷值的合法性    if (flag == -1)    {        printf("沒有要刪除的值!\n");    }    else    {        //定義兩個輔助遊標指標        Node *p, *q;                //給q,p賦值        q= list->head;        p = list->head->next;                //迴圈尋找相應的值並刪除        while (p != NULL)        {            if (p->data == obj)            {                q->next = p->next;                p->next = NULL;                free(p);                break;            }            q = p;            p = p->next;        }    }}

 

  8.往鏈表中插入資料

/************************************************ *功能:往指定的位置後插入相應的值 *參數:鏈表指標,插入的位置,插入的值 *Mr.li *日期:14-07-23 ************************************************/void insert(List *list, int local, int number){    int count = 0;    //判斷值的合法性    if(count > list->count)    {        printf("你輸入的值不合法\n");    }    else    {        //定義遊標指標,指向鏈表的頭結點        Node *p = list->head;        while (count != local) {            p++;            count++;        }                //分配新的結點並給新的結點賦值        Node *q = (Node *) malloc(sizeof(Node));        q->data = number;        q->next = NULL;                //插入新的結點        q->next = p->next;        p->next = q;    }    }

C語言之鏈表

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.