雙向循環鏈表的刪除

刪除某個結點,其實就是插入某個結點的逆操作。還是對於雙向循環鏈表,要在連續的三個結點s,p,q中刪除p結點,只需把s的右鏈域指針指向q,q的左鏈域指針指向s,並收回p結點就完成了。
下面就是一個應用雙向循環鏈表刪除算法的例子:
  1. #include
  2. #include
  3. #include
  4. #define N 10
  5. typedef struct node
  6. {
  7. char name[20];
  8. struct node *llink,*rlink;
  9. }stud;
  10. stud * creat(int n)
  11. {
  12. stud *p,*h,*s;
  13. int i;
  14. if((h=(stud *)malloc(sizeof(stud)))==NULL)
  15. {
  16. printf("不能分配內存空間!");
  17. exit(0);
  18. }
  19. h->name[0]='/0';
  20. h->llink=NULL;
  21. h->rlink=NULL;
  22. p=h;
  23. for(i=0;i〈n;i++)
  24. {
  25. if((s= (stud *) malloc(sizeof(stud)))==NULL)
  26. {
  27. printf("不能分配內存空間!");
  28. exit(0);
  29. }
  30. p-〉rlink=s;
  31. printf("請輸入第%d個人的姓名",i+1);
  32. scanf("%s",s->name);
  33. s->llink=p;
  34. s->rlink=NULL;
  35. p=s;
  36. }
  37. h->llink=s;
  38. p->rlink=h;
  39. return(h);
  40. }
  41. stud * search(stud *h,char *x)
  42. {
  43. stud *p;
  44. char *y;
  45. p=h->rlink;
  46. while(p!=h)
  47. {
  48. y=p->name;
  49. if(strcmp(y,x)==0)
  50. return(p);
  51. else p=p->rlink;
  52. }
  53. printf("沒有查找到該數據!");
  54. }
  55. void print(stud *h)
  56. {
  57. int n;
  58. stud *p;
  59. p=h->rlink;
  60. printf("數據信息爲:/n");
  61. while(p!=h)
  62. {
  63. printf("%s ",&*(p->name));
  64. p=p->rlink;
  65. }
  66. printf("/n");
  67. }
  68. void del(stud *p)
  69. {
  70. (p->rlink)->llink=p->llink;
  71. (p->llink)->rlink=p->rlink;
  72. free (p);
  73. }
  74. main()
  75. {
  76. int number;
  77. char studname[20];
  78. stud *head,*searchpoint;
  79. number=N;
  80. clrscr();
  81. head=creat(number);
  82. print(head);
  83. printf("請輸入你要查找的人的姓名:");
  84. scanf("%s",studname);
  85. searchpoint=search(head,studname);
  86. printf("你所要查找的人的姓名是:%s/n",*&searchpoint->name);
  87. del(searchpoint);
  88. print(head);

發佈了26 篇原創文章 · 獲贊 4 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章