链表

作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序。

在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表。

与之前不同的是,这里建立的是包含数据的头结点head:

下面是代码,包含创建部分,输出部分,删除部分,和插入部分。

struct Node
{
int data;
Node *next;
}; int n = 0; // 结点数 //=============Node_Creat==============//
Node *Node_Creat()
{
Node *head = NULL; // 头指针置NULL Node *p1,*p2; // 开辟一个Node大小的空间 使p1和p2指向该空间
p1 = p2 = (Node *)malloc(sizeof(Node));
if(p1 == NULL || p2 == NULL)
{
printf("Overflow\n");
exit(1);
} scanf("%d",&p1 -> data); while(p1 -> data >= 0)
{
n++; if(head == NULL)
{
head = p1;
}
else
{
p2 -> next = p1;
} p2 = p1;
p1 = (Node *)malloc(sizeof(Node));
if(p1 == NULL)
{
printf("Overflow\n");
exit(1);
} scanf("%d",&p1 -> data);
} p1 = NULL;
p2 -> next = NULL;
return head;
} //============Node_Print==============//
void Node_Print(Node *head)
{
Node *p = head;
if(head == NULL) // 链表为空
{
printf("Empty!\n");
return ;
}
else
{
printf("Total: %d Node\n",n);
while(p != NULL)
{
printf("%d ",p -> data);
p = p -> next;
}
printf("\n");
}
} //==============Node_Delete()===============//
void Node_Delete(Node *head,int num)
{
Node *p1,*p2;
p1 = head; if(p1 == NULL) // 链表为空
{
printf("Empty\n");
return ;
} if(num > n) // 结点不存在
{
printf("Not Found!\n");
return ;
} n--; // 结点数-1 int i;
for(i = 1; i < num; i++)
{
if(p1 -> next == NULL)break; p2 = p1;
p1 = p1 -> next;
} if(p1 == head) // 头节点 即第一个
{
head = p1 -> next;
}
else
{
p2 -> next = p1 -> next;
free(p1);
} Node_Print(head);
} //============Node_Insert()============//
void Node_Insert(Node* head,int num,int i_data)
{
Node * newNode;
newNode = (Node *)malloc(sizeof(Node));
if(newNode == NULL)
{
printf("Overflow\n");
exit(1);
}
newNode -> data = i_data;
newNode -> next = NULL; Node *p1,*p2;
p1 = head; for(int i = 1 ;i < num; i++)
{
p2 = p1;
p1 = p1 -> next;
} p2 -> next = newNode;
newNode -> next = p1; n++; // 结点数+1 Node_Print(head);
}

样例:

链表的反转

我这里采用的方法是 改变两个结点间next指针的指向,原结点next指针指向下一个结点,反转后指向前一个结点。

Node* Node_Reverse(Node* head)
{
Node* pNow = head;//当前结点
Node* pPrv = NULL;//当前结点的前一个结点
Node* pReversedHead = NULL;//反转链表头结点 Node* pNext = NULL;//当前结点的下一个结点
while(pNow != NULL)
{
pNext = pNow -> next;
if(pNext == NULL)//如果当前结点的下一个结点为空,那么反转链表的头结点就是当前结点。
pReversedHead = pNow; pNow -> next = pPrv;//当前结点指向前一个结点 pPrv = pNow;//pPrv和pNow往前移动。
pNow = pNext;//这里要使用前面保存下来的pNext,不能使用pNow->next
}
return pReversedHead;//返回反转链表头指针。
}

大概的一个流程图(反转第一个结点)

注:红色箭头代表pPrev,pNext和pNow的移动,蓝色代表next指针的指向。

又见链表 --- 另一种Creat方式与反转的更多相关文章

  1. Android中BroadcastReceiver的两种注册方式(静态和动态)详解

    今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来 ...

  2. 通过三个DEMO学会SignalR的三种实现方式

    一.理解SignalR ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信(即:客户端(Web页面)和服务器端可以互相实时的通知消息 ...

  3. (转)WCF开发框架形成之旅---WCF的几种寄宿方式

    WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...

  4. Python模块常用的几种安装方式

    Python模块安装方法 一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:pytho ...

  5. php 递归函数的三种实现方式

    递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去.实现递归函数可以采取什么方式呢?本文列出了三种基本方式.理解其原来需要一定的基础知识 ...

  6. Android数据的四种存储方式

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...

  7. Android开发_Android数据的四种存储方式

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  8. MyEclipse中web服务器的三种配置方式

    初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...

  9. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

随机推荐

  1. iOS连续上传多张图片

    参考地址:http://www.cocoachina.com/ios/20180730/24366.html 需求是怎样的:for 循环里面.多个网络请求上传图片,每次上传一张,至于为什么每次只上传一 ...

  2. ubuntu 安装ftp nginx tomcat,mysql

    tomcat sudo apt-get install tomcat 访问方式,http://loclahost:8080 进入sbin目录下 sudo ./startup.sh开启 sudo ./s ...

  3. 流媒体ts/ps流封装/分析

    1.TS 1) 感谢星辰同学,还热乎着,

  4. Scala系统学习(二):Scala开发环境安装配置

    Scala可以安装在任何基于UNIX/Linux或基于Windows的系统上.在您的机器上开始安装Scala之前,必须在计算机上安装Java 1.8或更高版本. 下面请按照以下步骤安装Scala. 步 ...

  5. 让你分分钟了解Web接口测试

    因为前后端架构分离技术的兴起,接口测试也越来越重要,最近一直想总结下,作为一个近三年的测试人员,接口这个词是耳濡目染的,而开发张口闭口也都是这个接口或那个接口怎么怎么样,自己遇到的bug也很多是接口问 ...

  6. [LeetCode] 532. K-diff Pairs in an Array_Easy tag: Hash Table

    Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in t ...

  7. C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法

    对于无标题栏窗体,也就是FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还 ...

  8. 转载的 Linux下chkconfig命令详解

    Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. ...

  9. mysql表空间文件

    1.共享表空间文件.默认表空间文件是ibdata1,大小为10M,且可拓展.共享表空间可以由多个文件组成,一个表可以跨多个文件而存在,共享表空间的最大值限制是64T. 2.独立表空间文件.独立表空间只 ...

  10. 关于gg_bd_ad_720x90.js和follow.js

    很多人对gg_bd_ad_720x90.js和follow.js 抱有疑问,这是个什么鬼? 我也迷惑了一阵子,今天偶然发现了这两个源文件. 大家一起欣赏下. 注意红色加粗代码. 1.follow.js ...