//
// main.c
// testLink
//
// Created by lan on 16/3/6.
// Copyright © 2016年 lan. All rights reserved.
// #include <stdio.h>
#include <malloc/malloc.h>
#include <stdlib.h>
#include <stdbool.h> typedef struct Node {
int date; // 数据域
struct Node * pNext; // 指针域
}NODE, * PNODE; PNODE create_list(void); // 创建一个链表
void traverse_link(PNODE); // 遍历链表
bool is_empty(PNODE pHead);
int length_list(PNODE);
bool insert_list(PNODE, int, int);
bool delete_list(PNODE, int, int *);
void sort_list(PNODE); int main(int argc, const char * argv[])
{
int val; // 存放删除节点的值 PNODE pHead = NULL;
pHead = create_list();
printf("创建好的链表: ");
traverse_link(pHead); bool isEmpty = is_empty(pHead);
printf("链表是否为空 = %d\n", isEmpty); int length = length_list(pHead);
printf("链表的节点数 = %d\n", length); insert_list(pHead, 3, 99);
printf("在第 3 个节点插入 99: ");
traverse_link(pHead); delete_list(pHead, 4, &val);
printf("删除第 4 个节点: ");
traverse_link(pHead);
printf("删除了 = %d\n", val); sort_list(pHead);
printf("降序: ");
traverse_link(pHead); return 0;
} PNODE create_list()
{
int len; // 节点个数
int value; // 暂时存放节点的值 PNODE pHead = (PNODE)malloc(sizeof(NODE));
if (NULL == pHead)
{
printf("分配失败。程序终止!\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->pNext = NULL; printf("请输入创建链表节点的个数: ");
scanf("%d", &len); for (int i = 0; i < len; i++)
{
printf("请输入第%d个节点值: ", i+1);
scanf("%d", &value);
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->date = value; pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
} void traverse_link(PNODE pHead)
{
PNODE p = pHead->pNext;
while (NULL != p)
{
printf("%d ", p->date);
p = p->pNext;
}
printf("\n");
} bool is_empty(PNODE pHead) {
if (NULL == pHead->pNext) {
return true;
} else {
return false;
}
} int length_list(PNODE pHead) {
int len = 0;
PNODE p = pHead->pNext;
while (NULL != p) {
len++;
p = p->pNext;
}
return len;
} bool insert_list(PNODE pHead, int pos, int value) {
// if (pos > length_list(pHead) || pos <= 0) {
// return false;
// }
// PNODE pNew = (PNODE)malloc(sizeof(NODE));
// if (NULL == pNew) {
// printf("分配失败。程序终止!\n");
// exit(-1);
// }
// pNew->date = value;
//
// PNODE p = pHead->pNext;
// for (int i = 1; i < pos - 1; i++) {
// p = p->pNext;
// }
//
// PNODE q = p->pNext;
// p->pNext = pNew;
// pNew->pNext = q;
// return true; // 一种更高效的实现方式
PNODE p = pHead;
int i = 0;
while (p != NULL && i < pos - 1) {
p = p->pNext;
i++;
}
if (p == NULL || i > pos - 1) {
return false;
} PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew) {
printf("分配失败,程序终止!\n");
exit(-1);
}
pNew->date = value; PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
} bool delete_list(PNODE pHead, int pos, int * pValue) {
// if (pos > length_list(pHead) || pos <= 0) {
// return false;
// }
// PNODE p = pHead->pNext;
// for (int i = 1; i < pos - 1; i++) {
// p = p->pNext;
// }
//
// PNODE q = p->pNext;
// *pValue = q->date;
// p->pNext = p->pNext->pNext;
// free(q);
// q = NULL;
// return true; // 一种更高效的实现方式
PNODE p = pHead;
int i = 0;
while (NULL != p->pNext && i < pos - 1) {
p = p->pNext;
i++;
}
if (NULL == p->pNext || i > pos - 1) {
return false;
} PNODE q = p->pNext;
*pValue = q->date;
p->pNext = p->pNext->pNext;
free(q); // 记得释放 q 所指向的结构体
q = NULL; // 并把 q 指针指向 NULL
return true;
} void sort_list(PNODE pHead) {
int i,j,temp,len;
PNODE p,q; // int a[7] = {2,5,3,1,7,4,9};
// len = 7;
// for (i = 0; i < len - 1; i ++) {
// for (j = i + 1; j < len; j++) {
// if (a[i] < a[j]) {
// temp = a[i];
// a[i] = a[j];
// a[j] = temp;
// }
// }
// }
// // 打印输出
// for (int i = 0; i < 7; i ++) {
// printf("%d ", a[i]);
// }
// printf("\n"); // 仿照数组的排序来实现链表的排序
len = length_list(pHead);
for (i = 0, p = pHead->pNext; i < len - 1; i++,p = p->pNext) {
for (j = i + 1, q = p->pNext; j < len; j++, q = q->pNext) {
if (p->date < q->date) {
temp = p->date;
p->date = q->date;
q->date = temp;
}
}
}
}

输出结果:

请输入创建链表节点的个数: 5
请输入第1个节点值: 1
请输入第2个节点值: 2
请输入第3个节点值: 3
请输入第4个节点值: 4
请输入第5个节点值: 5
创建好的链表: 1 2 3 4 5
链表是否为空 = 0
链表的节点数 = 5
在第 3 个节点插入 99: 1 2 99 3 4 5
删除第 4 个节点: 1 2 99 4 5
删除了 = 3
降序: 99 5 4 2 1
Program ended with exit code: 0

【数据结构与算法】(二) c 语言链表的简单操作的更多相关文章

  1. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  2. C语言----------链表的简单操作

    #include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 st ...

  3. selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)

    selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver   selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...

  4. JavaScript 版数据结构与算法(三)链表

    今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...

  5. 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

    目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构算法 ...

  6. 学习JavaScript数据结构与算法 (二)

    学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...

  7. 数据结构与算法之java语言实现(一):稀疏数组

    一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...

  8. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  9. 数据结构与算法 基于c语言篇

    学习数据结构与算法走向深蓝之路 第一章:数据结构与算法概念型 数据结构:数据之间的相互关系,即是数据的组织形式. 基本组成:{ 数据:信息的载体 数据元素:数据基本单位: } 其结构形式有四种: 1, ...

随机推荐

  1. Vue开发入门看这篇文章就够了

    摘要: 很多值得了解的细节. 原文:Vue开发看这篇文章就够了 作者:Random Fundebug经授权转载,版权归原作者所有. 介绍 Vue 中文网 Vue github Vue.js 是一套构建 ...

  2. Scala学习1————scala开发环境搭建(windows 10)

    Scala开发环境搭建 先讲几点我学习scala的目的或者原因吧: JVM在企业中的霸主地位,Scala也是JVM上的语言,很有可能未来会从Java过度到Scala也不是不可能. 先进的函数式编程和面 ...

  3. [SGU 199] Beautiful People

    [SGU 199] Beautiful People The most prestigious sports club in one city has exactly N members. Each ...

  4. B - Sleuth

    Problem description Vasya plays the sleuth with his friends. The rules of the game are as follows: t ...

  5. 导入不同业务数据通过Excel实现

    很多公司都用到了老系统移植到新系统,数据自然也需要迁移,这个解决方案之一就是使用Excel文件导入. 结合公司实现,然后简单写了个Demo. (PS:去找朋友本想着花几十分钟弄出来炫耀一波,结果花了三 ...

  6. rabbit channel参数

    channel.exchangeDeclare() channel.ExchangeDeclare(string exchange: "cjlTest",string  type: ...

  7. Hive2.1.1集群搭建

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  8. Photoshop显示RGB值问题

    Bmp与JPEG格式的不同之处在哪里? 使用OpenCV读写图像,然后由Photoshop显示时候结果并不相同,使用jpg格式的图像灰度值明显大于bmp格式,但jpg格式的显示信息是错误的. 过程: ...

  9. PCL的学习必要性、重要性、意义及最初——持续修改中

    为什么学习PCL:图像描述:各种维度图像的逻辑描述形式  ^-^ 且点云库是机器人学领域的必备基础库,ICRA和IROS的计算机视觉相关一般都使用了PCL库,PCL库也成为ROS的基础部分,与机器人操 ...

  10. logging模块-logging.basicConfig、logger.setLevel、handler.setLevel优先级

    logging.basicConfig < handler.setLevel < logger.setLevel 1.脚本中没有配置logger.setLevel会使用handler.se ...