简单单链表问题_已解决
本帖最后由 涛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: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> 啥玩意儿? //带头单链表的逆置
#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 都是大佬,学习了 只想领个币 {:10_250:} 学习了 {:10_250:} 学习 {:10_250:} {:10_250:} {:10_250:} jackz007 发表于 2022-11-22 01:10
编译运行实况:
你好,还需要给头节点分配内存空间吗 涛4091 发表于 2022-11-22 21:38
你好,还需要给头节点分配内存空间吗
是节点就必须分配空间 xiaosi4081 发表于 2022-11-22 08:05
头指针要先赋值为NULL
你好,请问头指针为什么先赋值为NULL。其余的指针向是Node *p,*q 等,初始为什么不负值NULL 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; {:10_257:} {:10_258:} {:10_250:}
页:
[1]
2