鱼C论坛

 找回密码
 立即注册
查看: 1793|回复: 34

[已解决]简单单链表问题_已解决

[复制链接]
发表于 2022-11-22 00:14:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 涛4091 于 2023-2-23 10:59 编辑

问题:带头结点的单链表逆置
  1. //带头单链表的逆置
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. typedef int DataType;
  5. typedef struct Node{
  6.         DataType data;
  7.         struct Node *next;
  8. }Node;
  9. void RearInsert(Node *first){
  10.         int number,value;
  11.         printf("请输入要插入的个数:");
  12.         scanf("%d",&number);
  13.         Node *p=first;   //工作指针
  14.         while(number){
  15.                 Node *s = (Node *)malloc(sizeof(Node));
  16.                 printf("请输入要插入的数值:");
  17.                 scanf("%d",&value);
  18.                 s->data = value;
  19.                 s->next = NULL;
  20.                 p->next = s;
  21.                 p=s;
  22.                 number = number-1;
  23.         }
  24. }

  25. void Reverse(Node *first){
  26.         printf("开始逆置\n");
  27.         Node *p=first->next;
  28.         Node *p_rear;
  29.         Node *L = first;
  30.         while(p != NULL){
  31.                 p_rear = p->next;
  32.                 p->next = L->next;
  33. //                printf("p->data = %d\n",p->data);
  34.                 L->next = p;
  35.                 printf("L->data = %d\n",L->next->data);
  36.                 p = p_rear;
  37.                
  38.         }
  39.        

  40. }
  41. void Printf(Node *first){
  42.         Node *p = first;
  43.         while(p->next){
  44.                 printf("单链表数据为:%d\n",p->next->data);
  45.                 p= p->next;
  46.         }
  47. }
  48. int main(){
  49.         Node *first = (Node *)malloc(sizeof(Node));
  50.         Node result;
  51.         first->next = NULL;
  52.         first->data = NULL;
  53.         RearInsert(first);
  54.         printf("打印单链表:\n");
  55.         Printf(first);
  56.         Reverse(first);
  57.         printf("逆置后的单链表:\n");
  58.         Printf(first);
  59.         return 0;
  60. }
复制代码


用了头插法。运行后无限循环
最佳答案
2022-11-22 01:10:40
本帖最后由 jackz007 于 2022-11-22 01:14 编辑
  1. //带头单链表的逆置
  2. #include<stdio.h>
  3. #include<stdlib.h>

  4. typedef int DataType;

  5. typedef struct Node {
  6.         DataType data      ;
  7.         struct Node * next ;
  8. } Node                     ;

  9. void RearInsert(Node ** first)
  10. {
  11.         Node * p , * q                                    ;   
  12.         int number , value                                ;
  13.         printf("请输入要插入的个数:")                    ;
  14.         scanf("%d", & number)                             ;
  15.         for(q = * first ; q && q -> next ; q = q -> next) ;
  16.         for(int i = 0 ; i < number ; i ++) {
  17.                 p = (Node *) malloc(sizeof(Node))         ;
  18.                 printf("请输入要插入的数值:")            ;
  19.                 scanf("%d", & value)                      ;
  20.                 p -> data = value                         ;
  21.                 p -> next = NULL                          ;
  22.                 if(q) q -> next = p                       ;
  23.                 else * first = p                          ;
  24.                 q = p                                     ;
  25.         }
  26. }

  27. void Reverse(Node ** first)
  28. {
  29.         printf("开始逆置\n")     ;
  30.         Node * p , * q , * next  ;
  31.         for(p = * first , q = NULL ; p ; ) {
  32.                 next = p -> next ;
  33.                 p -> next = q    ;
  34.                 q = p            ;
  35.                 p = next         ;
  36.         }
  37.         * first = q              ;        
  38. }

  39. void Printf(Node * first)
  40. {
  41.         Node * p = first                                 ;
  42.         while(p) {
  43.                 printf("单链表数据为:%d\n" , p -> data) ;
  44.                 p = p->next                              ;
  45.         }
  46. }

  47. int main()
  48. {
  49.         Node * first = NULL                              ;  // 头指针赋初值为 NULL 非常重要!!!
  50.         RearInsert(& first)                              ;
  51.         printf("打印单链表:\n")                         ;
  52.         Printf(first)                                    ;
  53.         Reverse(& first)                                 ;
  54.         printf("逆置后的单链表:\n");
  55.         Printf(first)                                    ;
  56.         return 0                                         ;
  57. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入要插入的个数:5
  4. 请输入要插入的数值:1
  5. 请输入要插入的数值:2
  6. 请输入要插入的数值:3
  7. 请输入要插入的数值:4
  8. 请输入要插入的数值:5
  9. 打印单链表:
  10. 单链表数据为:1
  11. 单链表数据为:2
  12. 单链表数据为:3
  13. 单链表数据为:4
  14. 单链表数据为:5
  15. 开始逆置
  16. 逆置后的单链表:
  17. 单链表数据为:5
  18. 单链表数据为:4
  19. 单链表数据为:3
  20. 单链表数据为:2
  21. 单链表数据为:1

  22. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 01:10:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-22 01:14 编辑
  1. //带头单链表的逆置
  2. #include<stdio.h>
  3. #include<stdlib.h>

  4. typedef int DataType;

  5. typedef struct Node {
  6.         DataType data      ;
  7.         struct Node * next ;
  8. } Node                     ;

  9. void RearInsert(Node ** first)
  10. {
  11.         Node * p , * q                                    ;   
  12.         int number , value                                ;
  13.         printf("请输入要插入的个数:")                    ;
  14.         scanf("%d", & number)                             ;
  15.         for(q = * first ; q && q -> next ; q = q -> next) ;
  16.         for(int i = 0 ; i < number ; i ++) {
  17.                 p = (Node *) malloc(sizeof(Node))         ;
  18.                 printf("请输入要插入的数值:")            ;
  19.                 scanf("%d", & value)                      ;
  20.                 p -> data = value                         ;
  21.                 p -> next = NULL                          ;
  22.                 if(q) q -> next = p                       ;
  23.                 else * first = p                          ;
  24.                 q = p                                     ;
  25.         }
  26. }

  27. void Reverse(Node ** first)
  28. {
  29.         printf("开始逆置\n")     ;
  30.         Node * p , * q , * next  ;
  31.         for(p = * first , q = NULL ; p ; ) {
  32.                 next = p -> next ;
  33.                 p -> next = q    ;
  34.                 q = p            ;
  35.                 p = next         ;
  36.         }
  37.         * first = q              ;        
  38. }

  39. void Printf(Node * first)
  40. {
  41.         Node * p = first                                 ;
  42.         while(p) {
  43.                 printf("单链表数据为:%d\n" , p -> data) ;
  44.                 p = p->next                              ;
  45.         }
  46. }

  47. int main()
  48. {
  49.         Node * first = NULL                              ;  // 头指针赋初值为 NULL 非常重要!!!
  50.         RearInsert(& first)                              ;
  51.         printf("打印单链表:\n")                         ;
  52.         Printf(first)                                    ;
  53.         Reverse(& first)                                 ;
  54.         printf("逆置后的单链表:\n");
  55.         Printf(first)                                    ;
  56.         return 0                                         ;
  57. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入要插入的个数:5
  4. 请输入要插入的数值:1
  5. 请输入要插入的数值:2
  6. 请输入要插入的数值:3
  7. 请输入要插入的数值:4
  8. 请输入要插入的数值:5
  9. 打印单链表:
  10. 单链表数据为:1
  11. 单链表数据为:2
  12. 单链表数据为:3
  13. 单链表数据为:4
  14. 单链表数据为:5
  15. 开始逆置
  16. 逆置后的单链表:
  17. 单链表数据为:5
  18. 单链表数据为:4
  19. 单链表数据为:3
  20. 单链表数据为:2
  21. 单链表数据为:1

  22. D:\[00.Exerciese.2022]\C>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 07:48:48 | 显示全部楼层

回帖奖励 +5 鱼币

啥玩意儿?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 08:05:56 | 显示全部楼层
  1. //带头单链表的逆置
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. typedef int DataType;
  5. typedef struct Node{
  6.         DataType data;
  7.         struct Node *next;
  8. }Node;
  9. void RearInsert(Node *first){
  10.         int number,value;
  11.         printf("请输入要插入的个数:");
  12.         scanf("%d",&number);
  13.         Node *p=first;   //工作指针
  14.         while(number){
  15.                 Node *s = (Node *)malloc(sizeof(Node));
  16.                 printf("请输入要插入的数值:");
  17.                 scanf("%d",&value);
  18.                 s->data = value;
  19.                 s->next = NULL;
  20.                 p->next = s;
  21.                 p=s;
  22.                 number = number-1;
  23.         }
  24. }

  25. void Reverse(Node *first){
  26.         printf("开始逆置\n");
  27.         Node *p=first->next;
  28.         Node *p_rear;
  29.         Node *L = first;
  30.         while(p != NULL){
  31.                 p_rear = p->next;
  32.                 p->next = L->next;
  33. //                printf("p->data = %d\n",p->data);
  34.                 L->next = p;
  35.                 printf("L->data = %d\n",L->next->data);
  36.                 p = p_rear;
  37.                
  38.         }
  39.         

  40. }
  41. void Printf(Node *first){
  42.         Node *p = first;
  43.         while(p->next){
  44.                 printf("单链表数据为:%d\n",p->next->data);
  45.                 p= p->next;
  46.         }
  47. }
  48. int main(){
  49.         Node *first = NULL
  50.         Node result;
  51.         first->next = NULL;
  52.         first->data = NULL;
  53.         RearInsert(first);
  54.         printf("打印单链表:\n");
  55.         Printf(first);
  56.         Reverse(first);
  57.         printf("逆置后的单链表:\n");
  58.         Printf(first);
  59.         return 0;
  60. }
复制代码


头指针要先赋值为NULL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 09:24:01 | 显示全部楼层

回帖奖励 +5 鱼币

都是大佬,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 09:47:19 | 显示全部楼层
只想领个币  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 12:41:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 14:55:17 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 14:58:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 18:30:39 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 18:31:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 18:32:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-22 18:58:32 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-22 21:38:13 | 显示全部楼层

你好,还需要给头节点分配内存空间吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-22 21:43:53 | 显示全部楼层

回帖奖励 +5 鱼币

涛4091 发表于 2022-11-22 21:38
你好,还需要给头节点分配内存空间吗

          是节点就必须分配空间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 21:54:10 | 显示全部楼层
xiaosi4081 发表于 2022-11-22 08:05
头指针要先赋值为NULL

你好,请问头指针为什么先赋值为NULL。其余的指针向是Node *p,*q 等,初始为什么不负值NULL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 22:14:22 | 显示全部楼层
jackz007 发表于 2022-11-22 21:43
是节点就必须分配空间
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef int DataType;
  4. typedef struct Node{
  5.         DataType data;
  6.         struct Node *next;
  7. }Node,*Linklist;

  8. int main(){
  9.         Node *first;
  10.         Linklist L;
  11. //        printf("%d",sizeof(first));
  12. //        printf("%d",sizeof(L));
  13.         return 0;
  14. }  
复制代码


你好,麻烦你了,再看下这两行语句是不是一个意思       
Node *first;
Linklist L;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-25 14:57:18 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-27 23:22:30 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-28 11:56:12 | 显示全部楼层

回帖奖励 +5 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 08:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表