通过C语言函数实现单链表的逆转操作

例:

输入数据1,2,3,4

输出数据4,3,2,1

一共三个文件:

头文件stulist,h :链表结点的定义,结点指针的定义

源文件stulist.c:具体的实现函数,主要包括三个,打印链表,创建链表和反转链表

测试文件test.c:调用实现功能;

stulist.c文件内容

 include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"stulist.h" List Reverse(List L) {
List head, p, q, r;
head = L;
p = L;
int n=;
while (p->Next) { //统计链表长度,使p指针指向最后一个结点
n++;
p = p->Next;
}
n++;
if (n == ) { //如果链表只有一个结点,直接返回
return head;
}else if (n == ) { //如果链表有两个结点,单独操作,实现反转
p = head;
q = p->Next;
head->Next = NULL;
q->Next = p;
head = q;
return head;
}
else { //如果链表有三个或三个以上结点,则通过三个指针交互操作,实现链表反转,此处遍历到最后一结点后单独操作,并将头结点指向该节点。
p = head; //p指向第一个结点,q指向第二个结点,r指向第三个结点
q = p->Next;
r = q->Next;
head->Next = NULL;
for (int i = ; i < n - ; i++) {
q->Next = p;
p = q;
q = r;
r = r->Next;
}
head = q;
head->Next = p;
}
return head; //返回头结点
}
List Read() /* 细节在此不表 */
{
//创建一个链表
List head, p,q;
int data;
head = NULL;
q = head;
while () {
printf("请输入学生记录:\n");
scanf("%d", &data);
if (data < ) {
break;
}
p = (PtrToNode)malloc(sizeof(List));
p->Data = data;
if (head == NULL) {
head = p;
}
else {
q->Next = p;
}
q = p;
if (head != NULL) {
q->Next = NULL;
}
}
return head;
}
void Print(List L) /* 细节在此不表 */
{
List p;
p = L;
printf("记录\n");
int i = ;
while (p) {
printf("%d\t%d\n",i, p->Data);
p = p->Next;
i++;
}
}

stulist,h文件

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof (struct stu_node)
typedef struct Node *PtrToNode;
struct Node {
int Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
typedef int ElementType;

test.c文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stulist.h" int main()
{
List L1, L2;
L1 = Read();
Print(L1);
L2 = Reverse(L1);
Print(L2); char mmmmm[];
gets_s(mmmmm);
getchar();
return ;
}

数据结构1_C---单链表的逆转的更多相关文章

  1. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  2. javascript数据结构之单链表

    下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...

  3. 数据结构之单链表的实现-java

    一.单链表基本概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元(一般是非连续存储单元)存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点的构成:元素data + 指针next ...

  4. PTA 单链表分段逆转

    6-9 单链表分段逆转 (25 分)   给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1 ...

  5. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...

  6. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...

  7. 数据结构 - 静态单链表的实行(C语言)

    静态单链表的实现 1 静态链表定义 静态链表存储结构的定义如下: /* 线性表的静态链表存储结构 */ #define MAXSIZE 1000 /* 假设链表的最大长度是1000 */ typede ...

  8. 数据结构 - 动态单链表的实行(C语言)

    动态单链表的实现 1 单链表存储结构代码描述 若链表没有头结点,则头指针是指向第一个结点的指针. 若链表有头结点,则头指针是指向头结点的指针. 空链表的示意图: 带有头结点的单链表: 不带头结点的单链 ...

  9. 【数据结构】单链表介绍及leetcode206题反转单链表python实现

    题目传送门:https://leetcode-cn.com/problems/reverse-linked-list/ 文章目录 单链表介绍 链表 概念 种类 优缺点 单链表(slist) leetc ...

  10. 数据结构(2):单链表学习使用java实现

    单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...

随机推荐

  1. C++输入输出常用格式(cin,cout,stringstream)

    输入格式 1.cin>>a; 最基本的格式,适用于各种类型.会过滤掉不可见字符例如空格,TAB,回车等 2.cin>>noskipws>>ch[i]; 使用了 no ...

  2. HttpServlet类

    1.我们知道让Servlet成功在服务端运行,就必须实现Servlet接口,而下面的这种方式没有直接实现Servlet接口,而是间接实现了Servlet接口: import javax.servlet ...

  3. 001: html基础标签

    一:浏览器内核(理解) 序言: 1:web标准 主要包括结构(Structure).表现(Presentation)和行为(Behavior)三个方面. 2:常见标签 2.1:HTML head bo ...

  4. [VB.NET Tips]字符串分隔

    在实际应用中,很多场景下都需要分隔字符串,如解析CSV文件等. 一般我们使用split方法来按照指定的分隔符来进行分隔字符串获得一个数组. Split方法的签名是: Split(ParamArray ...

  5. elasticsearch倒排索引与TF-IDF算法

    elasticsearch专栏:https://www.cnblogs.com/hello-shf/category/1550315.html 一.倒排索引(Inverted Index)简介 在关系 ...

  6. Spark开发常用参数

    Driver spark.driver.cores driver端分配的核数,默认为1,thriftserver是启动thriftserver服务的机器,资源充足的话可以尽量给多. spark.dri ...

  7. 网站开发过程中的URL写法

    在开发网页和服务器时发现,在很多地方需要写超链接 那么可以将超链接的使用者分为服务器和浏览器,以区分不同的写法 地址可能使用的情况: 1.跳转 2.转发 3.服务器资源地址 4.浏览器超链接 impo ...

  8. Java面向对象笔记(五分钟秒懂)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

  9. frp 端口映射

    简介 frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透. 场景 利用处于内网或防火墙后 ...

  10. CentOS 安装lsof命令

    1.在控制台上输入:# yum install lsof,安装过程中按y进行确认 2.使用lsof -i :port 可以产看端口的进程信息