c语言-求教C语言单项链表逆置NODE * fun(NODE *h)函数每步步骤详细解读

问题描述

求教C语言单项链表逆置NODE * fun(NODE *h)函数每步步骤详细解读

#include
#include
#define N 5
typedef struct node {
int data;
struct node next;
} NODE;
/
*********found**********/
NODE * fun(NODE h)
{ NODE *p, *q, *r;
p = h;
if (p == NULL)
return NULL;
q = p->next;
p->next = NULL;
while (q)
{
/
*********found**********/
r = q->next;
q->next = p;
p = q;
/**********found**********/
q = r;
}
return p;
}
NODE *creatlist(int a[])
{ NODE *h,*p,*q; int i;
h=NULL;
for(i=0; i
{ _q=(NODE *)malloc(sizeof(NODE));_
q->data=a[i];
q->next = NULL;
if (h == NULL) h = p = q;
else { p->next = q; p = q; }
}
return h;
}
void outlist(NODE *h)
{ NODE *p;
p=h;
if (p==NULL) printf("The list is NULL!n");
else
{ printf("nHead ");
do
{ printf("->%d", p->data); p=p->next; }
while(p!=NULL);
printf("->Endn");
}
}
main()
{ NODE *head;
int a[N]={2,4,6,8,10};
head=creatlist(a);
printf("nThe original list:n");
outlist(head);
head=fun(head);
printf("nThe list after inverting :n");
outlist(head);
}

解决方案

 #include  <stdio.h>
#include  <stdlib.h>
#define    N    5 //数组长度 5
typedef struct node { //定义节点
  int  data; //数据
  struct node  *next; //下一个节点
} NODE;
/**********found**********/
NODE * fun(NODE *h) //插入函数
{ NODE  *p, *q, *r;
  p = h; // p指向头节点
  if (p == NULL) //如果为空,返回,不处理
    return NULL;
  q = p->next; // q指向p的下一个节点
  p->next = NULL;// 的下一个节点为空
  while (q) // 循环,直到q为null
  {
/**********found**********/
    r = q->next; // 让r指向q的下一个,
    q->next = p; // q的下一个为p
    p = q; // p为q
/**********found**********/
    q = r; //q为r,经过这几步,p被插入到链表里
  }
  return  p;
}
NODE *creatlist(int  a[]) //根据数组a创建链表
{  NODE  *h,*p,*q;        int  i;
   h=NULL;
   for(i=0; i<N; i++)
   {  _q=(NODE *)malloc(sizeof(NODE));_ //分配内存
      q->data=a[i]; // 数据复制
      q->next = NULL; //下一个节点为空
      if (h == NULL)  h = p = q; //如果头节点为空,都为空
      else    {  p->next = q;  p = q;   } // 把q插入
   }
   return  h; //返回头节点
}
void outlist(NODE  *h) //输出链表
{  NODE  *p;
   p=h;
   if (p==NULL)  printf("The list is NULL!n"); //链表为空
   else
   {  printf("nHead  "); //输出链表头
      do //循环
      {  printf("->%d", p->data); p=p->next;  } //打印链表当前元素,并且指向下一个元素
      while(p!=NULL); // 直到链表节点为null
      printf("->Endn"); //输出结束
  }
}
main()
{  NODE  *head; //定义头节点
   int  a[N]={2,4,6,8,10}; //数组
   head=creatlist(a); //根据数组得到链表
   printf("nThe original list:n"); //输出原始链表
   outlist(head); //输出
   head=fun(head); //插入节点
   printf("nThe list after inverting :n");
   outlist(head); //输出插入后的链表
}
时间: 2024-12-17 19:01:36

c语言-求教C语言单项链表逆置NODE * fun(NODE *h)函数每步步骤详细解读的相关文章

c语言-求教C语言判断素数程序算法,为何j&amp;amp;lt;=sqrt((double)i )??

问题描述 求教C语言判断素数程序算法,为何j<=sqrt((double)i )?? #include #include void fun(int a, int b, int *c) { int i,j,d,y; for (i=3;i<=a/2;i=i+2) { /************found**************/ y=1; for (j=2;j<=sqrt((double)i );j++)//??为何j<=sqrt((double)i )?? if (i%j==0)

c语言-求教C语言的输出问题。谢谢了。

问题描述 求教C语言的输出问题.谢谢了. 在C语言读入TXT文件的字符后,输出会在每一行中间有换行符.请问怎么取消这个换行符? 解决方案 怎么会有换行符,你加了 ? 解决方案二: 如果有,去掉 .或者你用的writeline,用write代替 解决方案三: C语言输出乱码问题c语言输出空格问题.C语言中的一个关于基本类型的输出问题 解决方案四: 你可以每次读取两行,把这两行加在一起,不就ok了嘛 解决方案五: ##1. 我觉得你应该考虑一下是不是自己的写入方式有问题,你检查下是不是自己在写进tx

图解单链表逆序

逆序思想 代码 测试 本篇博客,比较简单.对单链表逆序不理解的看看就可以了. 逆序思想 现假设有一链表,有待逆序操作.我们首先想到的就是将那个指针关系逆序了就行了呗. 事实上,就是这样.博主就是以这个为目标来完成的单链表逆序操作. Node pre = null; Node post = null; while(head!=null){ post = head.next; head.next = pre; pre = head; head = post; } 这便是逆序的核心了.下面我们就来一步

TZC 1472 逆置正整数,去前导零 (java一句话秒杀)

逆置正整数 http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1472 时间限制(普通/Java):1000MS/10000MS 运行内存限制:65536KByte 描述 输入一个三位正整数,将它反向输出. 输入 3位正整数 输出 输出逆置后的正整数(去除前导0) 样例输入 123 样例输出 321 提示 注意: 130逆置后是31 完整代码: /*328ms,567KB*/ import java.u

单链表-C语言求教merge(struct node *p,struct node *q)哪里出错了?

问题描述 C语言求教merge(struct node *p,struct node *q)哪里出错了? #include "stdio.h" #include "stdlib.h" struct node { int data; struct node next; }; struct node *creat(int *a) { struct node*h,*p,*q; int i; h=p=(struct node)malloc(sizeof(struct nod

C语言解字符串逆序和单向链表逆序问题的代码示例_C 语言

字符串逆序上次面试碰到一个单向链表逆序的题目,幸好对字符串逆序比较熟悉,类比做出来了.字符串逆序比较简单,直接上代码: void stringReverse(char* p1,char* p2) { if(p1==p2)return; //swap the value of p1 ,p2 *p1=(*p1)+(*p2); *p2=(*p1)-(*p2); *p1=(*p1)-(*p2); if(p1==p2-1)return; else stringReverse(++p1,--p2); } 调

c语言 数据结构-单链表的就地逆置 辅助空间为O(1)

问题描述 单链表的就地逆置 辅助空间为O(1) 求大神给个单链表的就地逆置 要不开拓辅助空间 原谅我没有C币 解决方案 struct Node{ int value; Node *next; }; void reverse(Node* head){ Node *prev, *cur, *next; cur = head; prev = NULL; while(cur != NULL){ next = cur->next; cur->next = prev; prev = cur; cur =

c语言-关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点

问题描述 关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点 下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错..功力不足实在解决不了..跪求大神解答..(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去..我肉眼实在找不出来.. #include<stdio.h> #include<stdlib.h> #incl

新手求教c语言在DEV C++中运行问题

问题描述 新手求教c语言在DEV C++中运行问题 ![ 为啥我所有的if语句都是不执行的,新手小白求教. 换成最简单的逻辑了还是不行,所有的if都不执行,全角半角的问题注意了并没有用 ----------------------------------问题来了,printf出来abc这时候是1,0,0 解决方案 你打印一下a,b,c看看,你输入的时候有逗号,空格,是不是导致b,c没有获取到实际的数字 解决方案二: 你输入的a= 1,b=2,c=3,第一步判断a是否比b大,答案是否定的,所以执行