test.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "list.h"
  5. struct person
  6. {
  7. int age;
  8. char name[20];
  9. struct list_head list;
  10. };
  11. void main(int argc, char* argv[])
  12. {
  13. struct person *pperson;
  14. struct person person_head;
  15. struct list_head *pos, *next;
  16. int i;
  17. // 初始化双链表的表头
  18. INIT_LIST_HEAD(&person_head.list);
  19. // 添加节点
  20. for (i=0; i<5; i++)
  21. {
  22. pperson = (struct person*)malloc(sizeof(struct person));
  23. pperson->age = (i+1)*10;
  24. sprintf(pperson->name, "%d", i+1);
  25. // 将节点链接到链表的末尾
  26. // 如果想把节点链接到链表的表头后面,则使用 list_add
  27. list_add_tail(&(pperson->list), &(person_head.list));
  28. }
  29. // 遍历链表
  30. printf("==== 1st iterator d-link ====\n");
  31. list_for_each(pos, &person_head.list)
  32. {
  33. pperson = list_entry(pos, struct person, list);
  34. printf("name:%-2s, age:%d\n", pperson->name, pperson->age);
  35. }
  36. // 删除节点age为20的节点
  37. printf("==== delete node(age:20) ====\n");
  38. list_for_each_safe(pos, next, &person_head.list)
  39. {
  40. pperson = list_entry(pos, struct person, list);
  41. if(pperson->age == 20)
  42. {
  43. list_del_init(pos);
  44. free(pperson);
  45. }
  46. }
  47. // 再次遍历链表
  48. printf("==== 2nd iterator d-link ====\n");
  49. list_for_each(pos, &person_head.list)
  50. {
  51. pperson = list_entry(pos, struct person, list);
  52. printf("name:%-2s, age:%d\n", pperson->name, pperson->age);
  53. }
  54. // 释放资源
  55. list_for_each_safe(pos, next, &person_head.list)
  56. {
  57. pperson = list_entry(pos, struct person, list);
  58. list_del_init(pos);
  59. free(pperson);
  60. }
  61. }