链表逆序(拷贝和插入)
主函数定义一个链表,储存控制台输入的n个整数;然后编写函数:
1.create函数,储存信息
2.reverse(head),将链表逆序,即原链表的头节点成为新链表的尾节点;原链表的尾节点成为新链表的头节点;
3.print函数,打印信息
输入样例:
5
1 2 3 4 5
输出样例:
1 2 3 4 5
5 4 3 2 1
代码如下:
方法一:创建一个新链表,先将旧链表的 head 作为新链表的 phead ,再将旧链表的 head 后移,依次将后一个 head 作为新链表的 phead ,直到 head -> next 为 NULL (开辟了新的内存空间)
#include<stdio.h>
#include<stdlib.h>struct node
{int data;struct node *next;
};struct node *create(int n)//创建链表
{struct node *head,*pnew,*ptail;int i;pnew=(struct node *)malloc(sizeof(struct node));scanf("%d",&pnew->data);head=pnew;ptail=pnew;for(i=1;i<n;i++){pnew=(struct node *)malloc(sizeof(struct node));scanf("%d",&pnew->data);ptail->next=pnew;ptail=pnew;}//forptail->next=NULL;return head;
}//createstruct node *reverse(struct node *head)
{struct node *pnew,*phead;pnew = (struct node *)malloc(sizeof(struct node));*pnew = *head;//进行拷贝phead = pnew;//将新链表的头节点指向pnewphead -> next = NULL;//第一个头作为新链表的尾节点while(head -> next != NULL){//将后面的节点依次插入在头节点前面pnew = (struct node *)malloc(sizeof(struct node));head = head -> next;*pnew = *head;pnew -> next = phead;phead = pnew;}//whilereturn phead;}//reversevoid print(struct node *head)//输出链表信息
{struct node *p=head;while(p!=NULL){printf("%d ",p->data);p=p->next;}//while
}//printint main()
{struct node *head;int n;scanf("%d",&n);head=create(n);//调用函数创建链表print(head);printf("\n");printf("逆序后前链表的节点信息为:\n");head=reverse(head);//调用函数实现链表逆序print(head);return 0;
}
方法二:不开辟新的空间
#include<stdio.h> #include<stdlib.h>struct link{int data;struct link *next; };struct link *reverse(struct link *head)//实现链表逆序 {struct link *new_head,*p=head->next ;new_head=(struct link*)malloc(sizeof(struct link));//创建一个新的头节点new_head->next=NULL;//新的头节点指向NULLwhile(p!=NULL)//使用头插法实现逆序{head=p->next;//将要逆序链表的头节点后移p->next=new_head->next;//将p的next指向新头节点的nextnew_head->next=p;//将p插入到新头节点的后面p=head;//重新将p指向head}free(head);//释放旧的头节点return new_head;//返回新的头节点 }struct link *create(int n)//创建链表 {struct link *head,*pnew,*ptail;int i;head=(struct link *)malloc(sizeof(struct link));//头节点不存储数据pnew=(struct link *)malloc(sizeof(struct link));scanf("%d",&pnew->data);head->next=pnew;ptail=pnew;for(i=1;i<n;i++){pnew=(struct link *)malloc(sizeof(struct link));scanf("%d",&pnew->data);ptail->next=pnew;ptail=pnew;}ptail->next=NULL;return head; }void print(struct link *head)//输出链表信息 {struct link *p=head->next;while(p!=NULL){printf("%3d",p->data);p=p->next;}printf("\n"); }int main() {struct link *create(int n);//声明创建链表函数struct link *reverse(struct link *head);//声明链表逆序函数void print(struct link *head);//声明输出链表信息函数struct link *head;int n;printf("请输入节点的个数:\n");scanf("%d",&n);while(n==0){printf("无法创建链表!请重新输入n\n");scanf("%d",&n);}printf("请输入这些节点的信息:\n");head=create(n);//调用函数创建链表printf("逆序前链表的节点信息为:\n");print(head);printf("逆序后前链表的节点信息为:\n");head=reverse(head);//调用函数实现链表逆序print(head);return 0; }
链表逆序(拷贝和插入)相关推荐
- c语言将一个已知头结点的单链表逆序_C语言数据结构实现链表逆序并输出
C语言数据结构实现链表逆序并输出 将一个链表逆序并输出.我用了两种方法来实现,第一种是借助了一个新的空链表:第二种是在原来链表的基础上直接实现逆序. 实例代码: 头文件: #include #incl ...
- 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定 链表基本操作实现 c语言版本, 该程序在visual c++ 6.0上调试通过! 本人写该程序完全是为学习交流之用,还望大家多多 ...
- c语言单链表_C语言笔试题—单链表逆序
前情回顾 之前更多的是给大家推荐的是好用的软件,经过反思之后觉得这些东西并不是我想要的,所以从今天开始我要转变方向了,更多的往我的专业方向去发展(虽然我是个小白),当然如果有说的不对的地方,希望大家能 ...
- 自定义链表增,删除,链表逆序
工作时间长了,经常用框架,感觉真的成了coding,建议有时间可以刷一下lettcode 时间一长就会忘,写了大半天,记录一下,理解后再写特别简单,链表逆序看了很多博客,写法各式各样,但是感觉解释的还 ...
- C++实现链表逆序打印、链表反转
//题目:C++实现链表逆序打印.链表反转 // 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. // 方法1:只 ...
- 简单算法 - 链表逆序思路详解
1.1.1 链表逆序 1.1.1.1 思路 如A->B->C->D->E 一般会有以下两种思路,如下 思路一: 先取出链表的最后一个E ...
- 链表详解(单链表、双向链表、链表逆序)
目录 线性表 顺序存储结构 链式存储结构 单链表 单链表定义 单链表基本操作(仅供参考) 实例 循环单链表的状态图 双向链表 双向链表定义 双向链表特点 双向链表基本操作(仅供参考) 实例 双向链表的 ...
- C++ Python 链表逆序 反转链表
** 以下为C++版本 ** 已知链表头节点指针head,将链表逆序.(不可申请额外空间) #include<stdio.h> struct ListNode {int val; //数据 ...
- 【链表】C++链表反转、链表逆序打印
转载地址:http://blog.csdn.net/yebanxin/article/details/51942598 题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面 ...
最新文章
- 多级反馈队列列算法的优点
- 虚拟网卡与物理网卡TCP协议数据传输对比
- DataSet case sensitive issue
- try not do unnecessary subscriptions
- 一个IT青年北漂四年的感悟
- java 在线编辑器_最好的Markdown开源在线编辑器,没有之一!
- 剑指offer--二维数组的查找
- poj 1269 直线相交情况
- 调研了10家公司的技术架构,我总结出了一套大数据平台的套路
- Python打印某范围内的素数
- 《深入浅出MFC》学习笔记
- PowerShell 中执行 dir /b /s
- To C、To G、To B,数字化转型
- 学习PLC到底要不要买PLC?
- 图书管理系统E-R图转关系图
- 文档服务器 件排名,服务器十大品牌排名
- 一起来找:程序员必去的社区与网站
- PRISM 下载安装
- java 重启路由器
- sqlserver dba