因應需求動態配置記憶體,避免記憶體的浪費。
不過相對的實現與操作也較陣列麻煩許多

Library Functions Manual sys/queue.h 內當中,都有提供定義好的MARCO使用.


在網路找尋教學,下面來簡單實現看看~
定義一個簡單個 Struct
#define lens 255
typedef struct list{
  int         no;
  char        name[lens];
  struct list *next;
}node;

創建node
node* create_node(int no,char *name)
{
  node *n = malloc(sizeof(node));
  if(n == NULL) return NULL;
  n->no = no;
  strncpy(n->name, name, lens -1);
  n->next = NULL;

  return n;
}

搜尋回傳
void* search_node(node* header, char *name)
{
  node* n = header;
  int search_flag = 0;
  while(n != NULL)
  {
    if(!strcmp(n->name,name)){
      search_flag = 1;
      break;
    }else
      n = n->next;
  }
  if(search_flag) return n;

  return NULL;
}

插入
void insert_node(node* n1, node* n2)
{
  n2->next = n1->next;
  n1->next = n2;
}

移除
void remove_node(node* n1)
{
  n1->next = n1->next->next;
}

顯示
void printf_lists(node* lists)
{
  node *n = lists;
  while(n != NULL)
  {
    printf("n: %d\n",n->no);
    printf("name: %s\n",n->name);
    n = n->next;
  }
  printf("\n");
}

釋放
void free_lists(node *lists)
{
  if(lists->next != NULL)
    free_lists(lists->next);

  free(lists);
}

動作流程
int main(void)
{
 node* header = create_node(0,"charles0");
 node* a = create_node(1,"charles1");
 node* b = create_node(2,"charles2");
 node* c = create_node(3,"charles3");
 node* d = create_node(4,"charles4");
 node* e = create_node(5,"charles5");
 node* s = NULL;

 //0-5
 insert_node(header, e);
 //0-1-5
 insert_node(header, a);
 //1-2-5 , 0-1-2-5
 insert_node(a, b);
 //1-3-2 , 0-1-3-2-5
 insert_node(a, c);
 //5-4 , 0-1-3-2-5-4
 insert_node(e, d);

 printf_lists(header);

 s = search_node(header, "charles2");
 if(s != NULL)
    printf("search name data %d %s\n",s->no, s->name);

 if((s = search_node(header, "charles8")) != NULL)
    printf("search name data %d %s\n",s->no, s->name);
 else
    printf("can't seatch anymore\n");
 free_lists(header);
 return 0;

}