双向循环链表的插入

来源:互联网 发布:手机搜不到4g网络 编辑:程序博客网 时间:2024/05/01 06:48
对于双向循环链表,我们现在可以随意地在某已知结点p前或者p后插入一个新的结点。
假若s,p,q是连续三个结点的指针,若我们要在p前插入一个新结点r,则只需把s的右链域指针指向r,r的左链域指针指向s,r的右链域指针指向p,p的左链域指针指向r即可。
在p,q之间插入原理也一样。
下面就是一个应用双向循环链表插入算法的例子:
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  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 insert(stud *p)
  69. {
  70. char stuname[20];
  71. stud *s;
  72. if((s= (stud *) malloc(sizeof(stud)))==NULL)
  73. {
  74. printf("不能分配内存空间!");
  75. exit(0);
  76. }
  77. printf("请输入你要插入的人的姓名:");
  78. scanf("%s",stuname);
  79. strcpy(s->name,stuname);
  80. s->rlink=p->rlink;
  81. p->rlink=s;
  82. s->llink=p;
  83. (s->rlink)->llink=s;
  84. }
  85. main()
  86. {
  87. int number;
  88. char studname[20];
  89. stud *head,*searchpoint;
  90. number=N;
  91. clrscr();
  92. head=creat(number);
  93. print(head);
  94. printf("请输入你要查找的人的姓名:");
  95. scanf("%s",studname);
  96. searchpoint=search(head,studname);
  97. printf("你所要查找的人的姓名是:%s/n",*&searchpoint->name);
  98. insert(searchpoint);
  99. print(head);
  100. }

原创粉丝点击