双向循环链表的删除

来源:互联网 发布:手机搜不到4g网络 编辑:程序博客网 时间:2024/05/01 13:34
删除某个结点,其实就是插入某个结点的逆操作。还是对于双向循环链表,要在连续的三个结点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);

原创粉丝点击