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 ...
随机推荐
- Spring (3)框架
Spring第三天笔记 今日内容 Spring的核心之一 - AOP思想 (1) 代理模式- 动态代理 ① JDK的动态代理 (Java官方) ② CGLIB 第三方代理 (2) AOP思想在Spr ...
- shell习题第21题:计算数字的个数
[题目要求] 计算文档a.txt中每一行出现数字的个数并且要计算一下整个文档中一共出现了几个数字 例如a.txt如下: sdhhyh776dbbgbfg dhhdffhhhs556644382 运行结 ...
- spring整合quartz框架
spring整合quartz: 网上也有很多教程,好多都是基于配置方式,我们使用当然怎么简单就怎么用,所以这里介绍基于注解方式整合quartz.前提:你需要有一个能运行的web项目. 1.引依赖: & ...
- [Vue]避免 v-if 和 v-for 用在同一个元素上
一般我们在两种常见的情况下会倾向于这样做: 情形1:为了过滤一个列表中的项目 (比如 v-for="user in users" v-if="user.isActive& ...
- cli create ssl certkey
cli create ssl certkey ############################### # 创建CA密钥 create ssl rsakey bwsrv-root.key -ex ...
- php实现命令行里输出带颜色文字
今天执行composer的时候看到命令窗口出现的提示里面有的关键性部分带有颜色,于是很好奇研究了一下,在这里记录下来 其实在命令行输出带颜色字体主要是使用的 ANSI 转义字符实现的,我们先看个例子: ...
- vue学习(4)-组件的创建,父子组件传值,$refs
模块化:代码逻辑 组件化:UI 组件的创建:1.
- bash基础——grep、基本正则表达式、扩展正则表达式、fgrep
grep grep全称:Globally search a Regular Expression and Print 全局搜索正则表达式 正规表达式本质上是一种"表示方法", 只要 ...
- zabbix low-level discovery 监控mysql
当一台服务器上MySQL有多个实例的时候,MySQL占用多个不同端口.利用zabbix的low-level discovery可以轻松监控. 思路参考:http://dl528888.blog.51c ...
- idou老师教你学Istio 07: 如何用istio实现请求超时管理
在前面的文章中,大家都已经熟悉了Istio的故障注入和流量迁移.这两个方面的功能都是Istio流量治理的一部分.今天将继续带大家了解Istio的另一项功能,关于请求超时的管理. 首先我们可以通过一个简 ...