实现一个单向链表的:创建、插入、删除、排序(冒泡)、逆向、搜索中间节点

#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实现单向链表的更多相关文章

  1. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  2. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  3. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  4. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  5. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

  6. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

  7. 数据结构——Java实现单向链表

    结点类: /** * @author zhengbinMac * 一个OnelinkNode类的对象只表示链表中的一个结点,通过成员变量next的自引用方式实现线性表中各数据元素的逻辑关系. */ p ...

  8. 输入一个单向链表,输出该链表中倒数第K个结点

    输入一个单向链表,输出该链表中倒数第K个结点,具体实现如下: #include <iostream> using namespace std; struct LinkNode { publ ...

  9. 单向链表JAVA代码

        //单向链表类 publicclassLinkList{       //结点类     publicclassNode{         publicObject data;         ...

  10. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

随机推荐

  1. Redis键的基本操作

    1.Redis键的键名查询 ·命令名称:KEYS ·语法:KEYS pattern ·Pattern的用法: ? 任意一个字符 * 任意个任意字符 [ae] a或者e [^ae] 除了a和e [a-c ...

  2. C#利用反射和泛型给不同对象赋值

    /// <summary> /// 适用于初始化新实体 /// </summary> static public T RotationMapping<T, S>(S ...

  3. 【转载】在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support

    在使用JDBC连接MySql时报错:You must configure either the server or JDBC driver (via the serverTimezone config ...

  4. flex应用实例

    代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  5. 超详细Nginx的安装和配置教程

    一. 编译安装nginx 下载nginx安装包 wget http://nginx.org/download/nginx-1.8.0.tar.gz 也可以选择其他版本,官网:http://nginx. ...

  6. 你不知道的javascript(上卷)读后感(二)

    this词法 熟悉ES6语法的开发者,箭头函数在涉及this绑定时的行为和普通函数的行为完全不一致.跟普通this绑定规则不一样,它使用了当前的词法作用域覆盖了this本来的值. 误解 this理解成 ...

  7. 1.关于OSI七层模型和两主机传输过程

    先回顾一下OSI七层模型有啥内容 (OSI模型与TCP/IP模型类似,这里只针对OSI模型展开) OSI参考模型为什么弃用呢?它的分层过于细致了,以至于使网络的体系结构变得复杂臃肿,有使用重叠的嫌疑, ...

  8. Django中使用缓存

    settings中的配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache ...

  9. DoD与TCP/IP

    DoD与TCP/IP都是协议栈. 什么是协议栈? 就是一套软件,默认安装完Windows就有,可以卸载再安装.把他卸载了,你就不能上网. 数据的封装以及解封装有网卡以及绑定的TCP/IP协议栈完成 A ...

  10. Nginx中ngx_http_fastcgi_module

    转发请求到 FastCGI 服务器器,不不⽀支持 php 模块⽅方式指令:15.1 fastcgi_pass设置 fastcgi 服务器器的地址.地址可以指定为域名或 IP 地址,以及端⼝口Synta ...