iOS標準庫中經常使用數據結構和算法之鏈表

上一篇:iOS系統中的經常使用數據結構之查找bash

⛓雙向鏈表

功能:對雙向鏈表進行添加、刪除功能。數據結構

頭文件:#include <search.h>函數

平臺:POSIXpost

函數簽名ui

//將某個鏈表元素element插入到pred後面。若是pred爲NULL則表示element就是鏈表的頭部。
void insque(void *element, void *pred);
//將鏈表元素element從鏈表中刪除。
void remque(void *element);
複製代碼

參數spa

element:[in] 要添加或者刪除的鏈表元素。code

pred:[in]鏈表插入元素element的前綴元素。內存

描述element

系統並無規定鏈表的數據結構,可是要求鏈表元素結構體中的前面兩個數據成員必須是分別指向後一個元素和前一個元素。下面就是鏈表元素結構體模板:rem

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);
}

複製代碼
相關文章
相關標籤/搜索