//
// 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. E20170809-mk

    collapse   n. 垮台; (身体的) 衰弱;               vt. 使倒塌; 使坍塌; 使瓦解;                vi. 崩溃; 倒塌; 折叠; (尤指工作劳累后 ...

  2. C# 设置百分比保留2位数

    double a=50; double b=100; 没有小数部分Label1.Text = (a   /   (a+b)).ToString("0%")   两位小数Label2 ...

  3. android 自定义view 前的基础知识

    本篇文章是自己自学自定义view前的准备,具体参考资料来自 Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了 ...

  4. 关于EasyUI datagrid editor combogrid搜索框的实现

    首先需要datagrid editor对combogrid的扩展,这个是别人实现的: $.extend($.fn.datagrid.defaults.editors, { combogrid: { i ...

  5. 【原创】.Net 微信 JS-SDK图片、语音上传接口的实现(MVC)-(一 、上传图片)

    前段时间在做一个微信的项目,遇到了一个上传图片的问题,花了一下午,解决了这个问题,然后把总结出来的代码,分享了出来. 最近又有一个图片+语音的功能, 更是蛋疼, 本次采用的不是File文件上传,然后转 ...

  6. 5.17 Quartz笔记

    有用到构建者模式: builder---JobDetail相当于需要构建者构建出来的一个配件:JobDetail为Job实例提供了许多设置属性,以及JobDetaMap成员变量属性,它用来存储特定Jo ...

  7. dubbo之线程模型

    事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求 ...

  8. 三维重建面试4:Jacobian矩阵和Hessian矩阵

    在使用BA平差之前,对每一个观测方程,得到一个代价函数.对多个路标,会产生一个多个代价函数的和的形式,对这个和进行最小二乘法进行求解,使用优化方法.相当于同时对相机位姿和路标进行调整,这就是所谓的BA ...

  9. window 8 电脑操作服务集合(网址)

    如何开启Win8远程桌面 http://jingyan.baidu.com/album/48206aeae06627216ad6b3bf.html?picindex=2 Win8.1用户账户的配置管理 ...

  10. nim游戏解法(转)

    转自:http://acm.hdu.edu.cn/forum/read.php?fid=9&tid=10617 取火柴的游戏 题目1:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若 ...