iOS標準庫中常用資料結構和演算法之連結串列

歐陽大哥2013發表於2019-04-22

上一篇:iOS系統中的常用資料結構之查詢

⛓雙向連結串列

功能:對雙向連結串列進行新增、刪除功能。

標頭檔案:#include <search.h>

平臺:POSIX

函式簽名

//將某個連結串列元素element插入到pred後面。如果pred為NULL則表示element就是連結串列的頭部。
void insque(void *element, void *pred);
//將連結串列元素element從連結串列中刪除。
void remque(void *element);
複製程式碼

引數

element:[in] 要新增或者刪除的連結串列元素。

pred:[in]連結串列插入元素element的字首元素。

描述

系統並沒有規定連結串列的資料結構,但是要求連結串列元素結構體中的前面兩個資料成員必須是分別指向後一個元素和前一個元素。下面就是連結串列元素結構體模板:

 struct que_elem {
	struct que_elem *next;
	struct que_elem *prev;
        //其他自定義資料成員
};
複製程式碼

上述的兩個函式只負責將元素插入連結串列以及將元素從連結串列中刪除,至於維護連結串列的表頭或者連結串列的數量以及連結串列元素的記憶體分配和銷燬則需要我們自身去維護。

示例程式碼:

//student結構體必須要滿足上面連結串列元素的結構體定義規則
typedef student
{
   struct student *next;
   struct student *prev;
   int age;
   char *name;
}student_t;

void traverse(student_t *head)
{
     while (head->next != NULL)
    {
         printf("student's age = %d, name=%s\n",head->age, head->name);
         head = head->next;
    }
}

void main()
{
     student_t *student1 = malloc(sizeof(student_t));
     student1->age = 10;
     student1->name = "Alex";

     student_t *student2 = malloc(sizeof(student_t));
     student2->age = 20;
     student2->name = "Bob";

     //student1作為連結串列的表頭
     insque(student1, NULL);
     //student2插入到student1後面
     insque(student2, student1);

    //遍歷連結串列
     traverse(student1);

      //刪除student1
      remque(student1);
      free(student1);

      //刪除student2
      remque(student2);
      free(student2);
}

複製程式碼

相關文章