【数据结构与算法】(二) c 语言链表的简单操作
//
// 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 语言链表的简单操作的更多相关文章
- 再次复习数据结构:c语言链表的简单操作
最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...
- C语言----------链表的简单操作
#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 st ...
- selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)
selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...
- JavaScript 版数据结构与算法(三)链表
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...
- 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录
目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构算法 ...
- 学习JavaScript数据结构与算法 (二)
学习JavaScript数据结构与算法 的笔记 包含第四章队列, 第五章链表 本人所有文章首发在博客园: http://www.cnblogs.com/zhangrunhao/ 04队列 实现基本队列 ...
- 数据结构与算法之java语言实现(一):稀疏数组
一.概念&引入 什么是稀疏数组? 稀疏数组是面对一个二维数组中有众多重复元素的情况下,为了节省磁盘空间,将此二维数组转化为更加节省空间的一种数组,我们叫他稀疏数组. 只是听概念或许会看不明白, ...
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- 数据结构与算法 基于c语言篇
学习数据结构与算法走向深蓝之路 第一章:数据结构与算法概念型 数据结构:数据之间的相互关系,即是数据的组织形式. 基本组成:{ 数据:信息的载体 数据元素:数据基本单位: } 其结构形式有四种: 1, ...
随机推荐
- .Net Core项目上Azure Docker云
1.找到创建资源-容器-Container Instances 2.安装模板,填写私有映像表的相关信息 3.创建成功,运行测试.
- MySql c#通用类
using System; using System.Collections.Generic; using System.Linq; using System.Text;//导命名空间 using S ...
- IBMWebsphere 使用jar包删除文件
1. 先使用ant打包一个jar包,删除其他不要的目录和文件,仅保留一个空的xxx.war文件夹("xxx"对应was上的工程安装根目录) 2. 在文件夹下新建一个META-INF ...
- Obsolete---标记方法 类过期
最近做一个接口的修改,由于是很老的接口,不太了解外部有多少地方引用了它. 但是内部的方法由于业务发展已经不太适合现在的需求,想改又不该动.所以想到了如果设置为过期. Obsolete 属性将某个程序实 ...
- jquery中的left和top
left 和 top /*1. 获取元素基于定位容器的位置*/ /*返回的是对象 属性 left top */ var position = $('.inner').position(); conso ...
- Md2All,把图片轻松上传到云图床,自动生成Markdown
内容目录 关于Md2AllMd2All的云图床效果直接把图片拖到编辑框截图,直接复制粘贴点图片图标选择图片注册七牛云帐号新建七牛云存储空间设置云图床密钥AK和SKBucketName和BucketDo ...
- Deutsch lernen (04)
1. streng a. 严厉的,严格的 streng gegen sich selbst und gegen andere sein streng auf Ordnung halten 2. ver ...
- dubbo之事件通知
事件通知 在调用之前.调用之后.出现异常时,会触发 oninvoke.onreturn.onthrow 三个事件,可以配置当事件发生时,通知哪个类的哪个方法 1. 服务提供者与消费者共享服务接口 in ...
- 解决Fiddler抓包上不了网的问题:
以前安装Fiddler 没有配置过相关设置,经常出现就是打开fiddler后,浏览器就无法上网了,刚开始觉得可能是因为而公司上网是需要自己的代理的,但fiddler打开后默认127.0.0.1作为IE ...
- AI:PR的数学表示-传统方法PR
前言: 接上一篇:AI:模式识别的数学表示 在图像处理PR领域,相对于ANN方法,其他的方法一般称为传统方法.在结构上,几乎所有的PR方法都是可解释的.且任一传统方法,在一定约束下,可以转换为SV近邻 ...