c实现单向链表
实现一个单向链表的:创建、插入、删除、排序(冒泡)、逆向、搜索中间节点
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std; typedef struct student
{
int data;
struct student *next;
} node; //创建链表
node *create()
{
//1. 定义变量
node *head = NULL;
node *p = NULL;
node *pnew = NULL; int x = ;
int cycle = ; //2. 新建头节点
head = (node*)malloc(sizeof(node));
p = head; //3. 添加新节点
while (cycle)
{
printf("input data:");
scanf("%d", &x);
if (x != )
{
pnew = (node*)malloc(sizeof(node));
pnew->data = x;
p->next = pnew;
p = pnew;
}
else
{
cycle = ;
}
} //4. 释放头节点
p->next = NULL;
p = head;
head = head->next;
free(p);
p = NULL; //5. 返回链表
return head;
} //计算链表长度
int length(node *head)
{
//1. 定义变量
node *p = NULL;
int n = ; //2. 遍历累加
p = head;
while (p != NULL)
{
p = p->next;
n++;
}
printf("%d\n", n); //3. 返回计数
return n;
} //显示
void show(node *head)
{
//1. 定义变量
node *p = NULL; //2. 遍历打印
p = head; while(p != NULL)
{
printf("data:%d ", p->data);
p = p->next;
}
printf("\n"); } //插入节点(升序)
node *insert (node *head, int num)
{
//1. 定义变量
node *p0 = NULL;
node *p1 = NULL;
node *p2 = NULL; //2. 新建节点
p0 = (node*)malloc(sizeof(node));
p0->data = num; //3. 定位插入位置(升序)
p1 = head;
while (p0->data > p1->data && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
} //4. 插入节点
if (p0->data > p1->data) //末尾
{
p1->next = p0;
p0->next = NULL;
}
else
{ if (head == p1) //头
{
p0->next = p1;
head = p0;
}
else //中间
{
p2->next = p0;
p0->next = p1;
}
} //5. 返回头
return head;
} //删除链表中指定节点
node *del(node *head, int num)
{
//1. 定义变量
node *p1 = NULL;
node *p2 = NULL; //2. 定位删除位置
p1 = head;
while (num != p1->data && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
} //3. 删除节点
if (num != p1->data)
{
printf("not found data to delete\n");
}
else
{
if(p1 == head)
{
head = p1->next;
free(p1);
p1 = NULL;
}
else
{
p2->next = p1->next;
free(p1);
p1 = NULL;
}
} //4. 返回头
return head; } //链表升序排序(冒泡算法)
node *sort(node *head)
{
//1. 定义变量
node *p = NULL;
int n = ;
int temp = ; if (head == NULL || head->next == NULL)
{
return head;
} //2. 获取链表长度
n = length(head); //3. 排序
for (int j=; j<n; ++j) //遍历所有节点
{
p = head;
for(int i=; i<n-j; ++i) //遍历未排序好的节点
{
if (p->data > p->next->data)
{
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
} p = p->next;
}
} //4. 返回头
return head; } //链表逆置
node *reverse(node *head)
{
//1. 定义变量
node *p1 = NULL;
node *p2 = NULL;
node *p3 = NULL; if (head == NULL || head->next == NULL)
{
return head;
} //2. 逆置
p1 = head;
p2 = p1->next;
while(p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
} //3. 调换头尾节点
head->next = NULL; //转置完后头节点成为尾节点
head = p1; //转置完后尾节点成为头节点 //4. 返回头
return head; } //搜索链表中间节点
//算法:以步长2和1单位同时遍历链表,步长2到末尾,步长1到中间
void searchmid(node *head, node *mid)
{
//1. 定义变量
node *p1 = NULL;
node *p2 = NULL; //2. 定位中间节点
p1 = head;
p2 = head;
while (p2->next != NULL && p2->next->next != NULL)
{
p1 = p1->next;
mid = p1;
p2 = p2->next->next;
} printf("mid:%d\n", mid->data);
} int main()
{
node *head = create();
int len = length(head);
show(head); head = insert(head, );
show(head); head = del(head, );
show(head); head = sort(head);
show(head); head = reverse(head);
show(head); node *mid;
searchmid(head, mid);
}
c实现单向链表的更多相关文章
- Reverse Linked List II 单向链表逆序(部分逆序)
0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...
- 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...
- 输出单向链表中倒数第k个结点
描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* ...
- Linus:利用二级指针删除单向链表
Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...
- 【转】Linus:利用二级指针删除单向链表
原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
#include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...
- 数据结构——Java实现单向链表
结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...
- 输入一个单向链表,输出该链表中倒数第K个结点
输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...
- 单向链表JAVA代码
//单向链表类 publicclassLinkList{ //结点类 publicclassNode{ publicObject data; ...
- C++ 单向链表反转
单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...
随机推荐
- ActiveMQ 简单应用
ActiveMQ简单应用到复杂的订单模块,提高前台的访问速度. 一.当提交订单后,发送消息给ActiveMQ. @Service public class JmsSend { private stat ...
- 内置函数----format
说明: 1. 函数功能将一个数值进行格式化显示. 2. 如果参数format_spec未提供,则和调用str(value)效果相同,转换成字符串格式化. >>> format(3.1 ...
- Apache ---- Solrl漏洞复现
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- redis cluster异地数据迁移,扩容,缩容
由于项目的服务器分布在重庆,上海,台北,休斯顿,所以需要做异地容灾需求.当前的mysql,redis cluster,elastic search都在重庆的如果重庆停电了,整个应用都不能用了. 现在考 ...
- ES6对数组的增强
来看数组的改变,Array.from()可以将类数组对象变为数组: Array.of方法用于将一组值,转化为数组: 寻找数组中是否拥有某项find().findIndex(),里面要放置回调函数: 要 ...
- Hibernate-validate工具类,手动调用校验返回结果
引言:在常见的工程中,一般是在Controller中校验入参,校验入参的方式有多种,这里介绍的使用hibernate-validate来验证,其中分为手动和自动校验,自动校验可以联合spring,使用 ...
- Mysql的管理
Linux系统中:mysql进入的命令为mysql -u root -p +你的mysql密码. Mysql是如何添加用户呢? 在mysql命令行下,使用use mysql;进入mysql的数据库中. ...
- Python爬微信好友头像,性别,所在地区
本文适合新手(有一定基础的小白) 今天没事,用的网页版微信,于是看源码心理作怪,F12打开,研究了一下,结果发现 /斜眼笑/斜眼笑/斜眼笑 再加上,没事干,(大家有好工作求介绍,本人待就业),Pyth ...
- 【C++/html版 代码 : 暴力破解数字红包 】-- 只要有编译器或者,不看运气,用手速敲代码说话,多人合作效果更佳!
需求分析: 或者是更大的范围! 是不是很捉急!运气背点不就over了! C++版: #include <stdio.h> #include <stdlib.h> #includ ...
- React中setState的怪异行为 ——setState没有即时生效
setState可以说是React中使用频率最高的一个函数了,我们都知道,React是通过管理状态来实现对组件的管理的,当this.setState()被调用的时候,React会重新调用render方 ...