将带头节点单链表元素逆置 C语言

向右看齐 2022-09-09 06:08 233阅读 0赞

函数fun的功能是将带头结点的单向链表逆置。

若原链表中从头至尾结点数据域依次为:2、4、6、8、10

逆置后,从头至尾结点数据域依饮为:10、8、6、4、2

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 5
  4. typedef struct node
  5. {
  6. int data;
  7. struct node *next;
  8. } NODE;
  9. void fun(NODE *h) {
  10. NODE *p, *q, *r;
  11. p = h->next;
  12. if (p == NULL)
  13. return;
  14. q = p->next;
  15. p->next = NULL;
  16. while (q) {
  17. r = q->next;
  18. q->next = p;
  19. p = q;
  20. q = r;
  21. }
  22. h->next = p;
  23. }
  24. NODE *creatlist(int a[]) {
  25. NODE *h, *p, *q;
  26. int i;
  27. h = (NODE *)malloc(sizeof(NODE));
  28. h->next = NULL;
  29. for (i = 0; i < N; i++) {
  30. q = (NODE *)malloc(sizeof(NODE));
  31. q->data = a[i];
  32. q->next = NULL;
  33. if (h->next == NULL)
  34. h->next = p = q;
  35. else
  36. {
  37. p->next = q;
  38. p = q;
  39. }
  40. }
  41. return h;
  42. }
  43. void outlist(NODE *h){
  44. NODE *p;
  45. p = h->next;
  46. if (p == NULL)
  47. printf("The list is NULL!\n");
  48. else {
  49. printf("\tHead");
  50. do {
  51. printf("->%d", p->data);
  52. p = p->next;
  53. } while (p != NULL);
  54. printf("->End\n");
  55. }
  56. }
  57. int main(){
  58. NODE *head;
  59. int a[N] = {2, 4, 6, 8, 10};
  60. head = creatlist(a);
  61. printf("The original list:\n");
  62. outlist(head);
  63. fun(head);
  64. printf("The list after inverting:\n");
  65. outlist(head);
  66. }

程序结果:

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAUGxlYXNlIFNpdCBEb3du_size_7_color_FFFFFF_t_70_g_se_x_16

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读

    相关 元素 C语言

    函数fun的功能是将不带头结点的单向链表逆置。 即若原链表中从头至尾结点数据域依次为:2、4、6、8、10 逆置后,从头至尾结点数据域依次为:10、8、6、4、2

    相关 实现(C++)

    对于单链表的逆置有两种方法可以实现 (1)利用辅助指针实现 基本思想:在遍历结点的过程中,设置辅助指针,用于记录先前遍历的结点。这样依次遍历的过程中只需修改其后继结点的ne

    相关 C语言实现

    单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决。 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递