鱼C论坛

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

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

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

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

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

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

问题:带头结点的单链表逆置
//带头单链表的逆置
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node{
        DataType data;
        struct Node *next;
}Node; 
void RearInsert(Node *first){
        int number,value;
        printf("请输入要插入的个数:");
        scanf("%d",&number);
        Node *p=first;   //工作指针 
        while(number){
                Node *s = (Node *)malloc(sizeof(Node));
                printf("请输入要插入的数值:");
                scanf("%d",&value);
                s->data = value;
                s->next = NULL;
                p->next = s;
                p=s;
                number = number-1;
        }
}

void Reverse(Node *first){
        printf("开始逆置\n");
        Node *p=first->next;
        Node *p_rear;
        Node *L = first;
        while(p != NULL){
                p_rear = p->next;
                p->next = L->next;
//                printf("p->data = %d\n",p->data);
                L->next = p;
                printf("L->data = %d\n",L->next->data);
                p = p_rear;
                
        }
        

} 
void Printf(Node *first){
        Node *p = first;
        while(p->next){
                printf("单链表数据为:%d\n",p->next->data);
                p= p->next;
        }
}
int main(){
        Node *first = (Node *)malloc(sizeof(Node));
        Node result;
        first->next = NULL;
        first->data = NULL;
        RearInsert(first); 
        printf("打印单链表:\n");
        Printf(first);
        Reverse(first);
        printf("逆置后的单链表:\n");
        Printf(first);
        return 0;
} 

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

typedef int DataType;

typedef struct Node {
        DataType data      ;
        struct Node * next ;
} Node                     ; 

void RearInsert(Node ** first)
{
        Node * p , * q                                    ;   
        int number , value                                ;
        printf("请输入要插入的个数:")                    ;
        scanf("%d", & number)                             ;
        for(q = * first ; q && q -> next ; q = q -> next) ;
        for(int i = 0 ; i < number ; i ++) {
                p = (Node *) malloc(sizeof(Node))         ;
                printf("请输入要插入的数值:")            ;
                scanf("%d", & value)                      ;
                p -> data = value                         ;
                p -> next = NULL                          ;
                if(q) q -> next = p                       ;
                else * first = p                          ;
                q = p                                     ;
        }
}

void Reverse(Node ** first)
{
        printf("开始逆置\n")     ;
        Node * p , * q , * next  ;
        for(p = * first , q = NULL ; p ; ) {
                next = p -> next ;
                p -> next = q    ;
                q = p            ;
                p = next         ;
        }
        * first = q              ;        
}

void Printf(Node * first)
{
        Node * p = first                                 ; 
        while(p) {
                printf("单链表数据为:%d\n" , p -> data) ;
                p = p->next                              ;
        }
}

int main()
{
        Node * first = NULL                              ;  // 头指针赋初值为 NULL 非常重要!!!
        RearInsert(& first)                              ; 
        printf("打印单链表:\n")                         ;
        Printf(first)                                    ;
        Reverse(& first)                                 ;
        printf("逆置后的单链表:\n");
        Printf(first)                                    ;
        return 0                                         ;
} 
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
请输入要插入的个数:5
请输入要插入的数值:1
请输入要插入的数值:2
请输入要插入的数值:3
请输入要插入的数值:4
请输入要插入的数值:5
打印单链表:
单链表数据为:1
单链表数据为:2
单链表数据为:3
单链表数据为:4
单链表数据为:5
开始逆置
逆置后的单链表:
单链表数据为:5
单链表数据为:4
单链表数据为:3
单链表数据为:2
单链表数据为:1

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

使用道具 举报

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

typedef int DataType;

typedef struct Node {
        DataType data      ;
        struct Node * next ;
} Node                     ; 

void RearInsert(Node ** first)
{
        Node * p , * q                                    ;   
        int number , value                                ;
        printf("请输入要插入的个数:")                    ;
        scanf("%d", & number)                             ;
        for(q = * first ; q && q -> next ; q = q -> next) ;
        for(int i = 0 ; i < number ; i ++) {
                p = (Node *) malloc(sizeof(Node))         ;
                printf("请输入要插入的数值:")            ;
                scanf("%d", & value)                      ;
                p -> data = value                         ;
                p -> next = NULL                          ;
                if(q) q -> next = p                       ;
                else * first = p                          ;
                q = p                                     ;
        }
}

void Reverse(Node ** first)
{
        printf("开始逆置\n")     ;
        Node * p , * q , * next  ;
        for(p = * first , q = NULL ; p ; ) {
                next = p -> next ;
                p -> next = q    ;
                q = p            ;
                p = next         ;
        }
        * first = q              ;        
}

void Printf(Node * first)
{
        Node * p = first                                 ; 
        while(p) {
                printf("单链表数据为:%d\n" , p -> data) ;
                p = p->next                              ;
        }
}

int main()
{
        Node * first = NULL                              ;  // 头指针赋初值为 NULL 非常重要!!!
        RearInsert(& first)                              ; 
        printf("打印单链表:\n")                         ;
        Printf(first)                                    ;
        Reverse(& first)                                 ;
        printf("逆置后的单链表:\n");
        Printf(first)                                    ;
        return 0                                         ;
} 
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

D:\[00.Exerciese.2022]\C>x
请输入要插入的个数:5
请输入要插入的数值:1
请输入要插入的数值:2
请输入要插入的数值:3
请输入要插入的数值:4
请输入要插入的数值:5
打印单链表:
单链表数据为:1
单链表数据为:2
单链表数据为:3
单链表数据为:4
单链表数据为:5
开始逆置
逆置后的单链表:
单链表数据为:5
单链表数据为:4
单链表数据为:3
单链表数据为:2
单链表数据为:1

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

使用道具 举报

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

回帖奖励 +5 鱼币

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

使用道具 举报

发表于 2022-11-22 08:05:56 | 显示全部楼层
//带头单链表的逆置
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node{
        DataType data;
        struct Node *next;
}Node; 
void RearInsert(Node *first){
        int number,value;
        printf("请输入要插入的个数:");
        scanf("%d",&number);
        Node *p=first;   //工作指针 
        while(number){
                Node *s = (Node *)malloc(sizeof(Node));
                printf("请输入要插入的数值:");
                scanf("%d",&value);
                s->data = value;
                s->next = NULL;
                p->next = s;
                p=s;
                number = number-1;
        }
}

void Reverse(Node *first){
        printf("开始逆置\n");
        Node *p=first->next;
        Node *p_rear;
        Node *L = first;
        while(p != NULL){
                p_rear = p->next;
                p->next = L->next;
//                printf("p->data = %d\n",p->data);
                L->next = p;
                printf("L->data = %d\n",L->next->data);
                p = p_rear;
                
        }
        

} 
void Printf(Node *first){
        Node *p = first;
        while(p->next){
                printf("单链表数据为:%d\n",p->next->data);
                p= p->next;
        }
}
int main(){
        Node *first = NULL
        Node result;
        first->next = NULL;
        first->data = NULL;
        RearInsert(first); 
        printf("打印单链表:\n");
        Printf(first);
        Reverse(first);
        printf("逆置后的单链表:\n");
        Printf(first);
        return 0;
} 

头指针要先赋值为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
是节点就必须分配空间
#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct Node{
        DataType data;
        struct Node *next;
}Node,*Linklist;

int main(){
        Node *first;
        Linklist L;
//        printf("%d",sizeof(first));
//        printf("%d",sizeof(L));
        return 0;
}  

你好,麻烦你了,再看下这两行语句是不是一个意思       
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-11-21 21:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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