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 ...
随机推荐
- substr函数索引创建测试
技术群里小伙伴,沟通说一条经常查询的SQL缓慢,单表SQL一个列作为条件,列是int数值类型,索引类型默认创建. 一.SQL文本substr函数索引创建测试 ,) nm1 ')需求,将上述SQL执行速 ...
- (十)Activitivi5之启动流程/完成任务的时候设置流程变量
一.启动流程的时候设置流程变量 1.1 案例 /** * 启动流程实例 */ @Test public void start() { Student student=new Student(); st ...
- 验证码识别的免费 OCR
在做接口自动化以及爬虫的过程中,验证码一般是个很烦的存在,其实大厂们已经做好了一些 OCR 供使用,这里介绍一下百度 OCR 的使用方法. 注册并生成应用 1.注册一个百度智能云账号:http://a ...
- a2 Bluebottle OS
a2 Bluebottle OS That is a copy of original A2 Repository Also extra ISO image A2_Rev-6498_serial-tr ...
- [JZOJ5888]GCD生成树
[JZOJ5888]GCD生成树 题目链接 gugugu 分析 对于N很小的情况,暴力Prim即可 对于值域很小的情况,我的想法与solution不太一样,将值相同的缩成一个点,\(O(w^2)\)预 ...
- 记一次Git提交报错的问题
通常代码版本控制的步骤是: 在代码版本控制平台新建一个仓库 clone远程仓库到本地 开始编码,然后是一系列add,commit,push 我的步骤是: 在远程代码版本管理平台新建一个仓库 在本地新建 ...
- stm32 SysTick系统定时器
它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取 当定时器计数到0时,将从LOAD 寄存器 ...
- Java基础加强-泛型
/*泛型*/ (泛型是给编译器看的) 泛型是提供给 /*javac编译器使用的*/,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型带类型说明的集合时,会去掉 "类 ...
- JavaScript程序块初始练习
由语句语句块,函数,对象,方法,属性构成.通过顺序,分支,循环三种基本程序控制结构来进行编程. 来一段小代码: <!DOCTYPE html> <html> <head& ...
- 服务器IP与个人IP的特点
服务器IP:系统类型.开放的端口及运行的服务.C段同类机器数量.是否机房.IDC服务商 个人IP:系统类型.开放的端口及运行的服务……