涛4091 发表于 2022-11-22 00:14:36

简单单链表问题_已解决

本帖最后由 涛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;
}

用了头插法。运行后无限循环

jackz007 发表于 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:\\C>g++ -o x x.c

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

D:\\C>

zhangjinxuan 发表于 2022-11-22 07:48:48

啥玩意儿?

xiaosi4081 发表于 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

kerln888 发表于 2022-11-22 09:24:01

都是大佬,学习了

wangyanren 发表于 2022-11-22 09:47:19

只想领个币

涛4091 发表于 2022-11-22 12:41:36

{:10_250:}

yukari123 发表于 2022-11-22 14:55:17

学习了

white_slacker 发表于 2022-11-22 14:58:27

{:10_250:}

1molHF 发表于 2022-11-22 18:30:39

学习

1molHF 发表于 2022-11-22 18:31:23

{:10_250:}

1molHF 发表于 2022-11-22 18:32:21

{:10_250:}

1molHF 发表于 2022-11-22 18:58:32

{:10_250:}

涛4091 发表于 2022-11-22 21:38:13

jackz007 发表于 2022-11-22 01:10
编译运行实况:

你好,还需要给头节点分配内存空间吗

jackz007 发表于 2022-11-22 21:43:53

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

          是节点就必须分配空间

涛4091 发表于 2022-11-22 21:54:10

xiaosi4081 发表于 2022-11-22 08:05
头指针要先赋值为NULL

你好,请问头指针为什么先赋值为NULL。其余的指针向是Node *p,*q 等,初始为什么不负值NULL

涛4091 发表于 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;

lxydaw 发表于 2022-11-25 14:57:18

{:10_257:}

1935951832 发表于 2022-11-27 23:22:30

{:10_258:}

1094570635 发表于 2022-11-28 11:56:12

{:10_250:}
页: [1] 2
查看完整版本: 简单单链表问题_已解决