因應需求動態配置記憶體,避免記憶體的浪費。
不過相對的實現與操作也較陣列麻煩許多
在 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;
}
0 意見:
張貼留言