#include <stdlib.h>
#include <malloc.h>
#include <stdio.h> typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE; PNODE create_list(void);
void traverse_list(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(void)
{
PNODE pHead = NULL;
int val;
pHead = create_list();
sort_list(pHead);
if (delete_list(pHead, , &val))
{
printf("delete %d ok!\n",val);
}
else
{
printf("delete wrong");
}
traverse_list(pHead);
int len = length_list(pHead);
if (is_empty(pHead))
{
printf("list is empty!");
}
else
{
printf("list isn't empty!");
}
return ;
} PNODE create_list(void)
{
int len;
int val;//用于存放用户输入的结点的值
printf("请输入链表的长度:len=");
scanf("%d", &len);
PNODE pHead = (PNODE)malloc(sizeof(Node)); if (NULL == pHead)
{
printf("分配失败,程序终止!");
exit(-);
}
PNODE pTail = pHead;
pTail->pNext = NULL; for (int i = ; i < len; ++i)
{
printf("请输入第%d个节点的值", i + );
scanf("%d", &val);
PNODE pNew = (PNODE)malloc(sizeof(Node));
if (NULL == pNew)
{
printf("分配失败,程序终止!");
exit(-);
}
pNew->data = val;
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
return pHead;
} void traverse_list(PNODE pHead)
{
PNODE p = pHead->pNext;
while (NULL != p)
{
printf("%d", p->data);
p = p->pNext;
}
printf("\n");
} bool is_empty(PNODE pHead)
{
if (NULL == pHead->pNext)
{
return true;
}
return false;
} int length_list(PNODE pHead)
{
int length = ;
PNODE p = pHead->pNext;
while (NULL != p)
{
length++;
p = p->pNext;
}
return length;
} void sort_list(PNODE pHead)
{
int i, j, t;
int len = length_list(pHead);
PNODE p, q;
for (i = , p = pHead->pNext; i < len - ; ++i, p=p->pNext)
{
for (j = i + , q = p->pNext; j < len; ++j, q = q->pNext)
{
if (p->data > q->data)
{
t = p->data;
p->data = q->data;
q->data = t;
}
}
}
return;
}
//在pHead指向链表的第pos个节点的前面插入一个新的节点,该节点的值为value,pos从1开始
bool insert_list(PNODE pHead, int pos, int value)
{
int i = ;
PNODE p = pHead;
while (NULL != p && i < pos - )
{
p = p->pNext;
++i;
}
if (i > pos - || NULL == p)
return false;
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if (NULL == pNew)
{
printf("动态分配内存失败!\n");
exit(-);
}
pNew->data = value;
PNODE q = p->pNext;
p->pNext = pNew;
pNew->pNext = q;
return true;
} bool delete_list(PNODE pHead, int pos, int *pVal)
{
int i = ;
PNODE p = pHead;
while (NULL != p->pNext && i < pos - )
{
p = p->pNext;
++i;
}
if (i > pos - || NULL == p->pNext)
{
return false;
}
PNODE q = p->pNext;
*pVal = q->data;
//删除p节点后面的节点
p->pNext = p->pNext->pNext;
free(q);
q = NULL;
return true;
} /*
1.链表的删除,比如删除p后的节点,如何操作?有时很容易遗漏free(r)的操作,导致内存泄漏。
可以如下操作:
r = p->next;
p->next = r->next;
free(r);
*/

c++链表基本操作的更多相关文章

  1. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  2. c++学习笔记—单链表基本操作的实现

    用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include  ...

  3. C++ 双链表基本操作

    上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都 ...

  4. C++ 单链表基本操作

    链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数 ...

  5. 链表基本操作与排序(c语言)

    本设计程序用C编写,完成单链表的生成,任意位置的插入.删除,以及确定某一元素在单链表中的位置.实现三种排序算法-冒泡排序.快速排序.合并排序.产生四个长度为100,1000,10000,50000的随 ...

  6. [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)

    题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...

  7. 转贴:C语言链表基本操作

    http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...

  8. java单链表基本操作

    /** * */ package cn.com.wwh; /** * @Description:TODO * @author:wwh * @time:2021-1-18 19:24:47 */ pub ...

  9. Java单链表实现

    /** * * 单链表基本操作 * * @author John * */ class LinkList { private Node first; private int pos = 0; publ ...

随机推荐

  1. redis集群篇

    redis集群的搭建 1.为什么要搭建集群(解决单点问题) 通过对redis的简单了解,我们知道redis已经有两种持久化方案rdb和aof.在redis出现宕机后,可能会出现部分的数据损失,但是数据 ...

  2. linux Centos7下安装python3及pip3

    先去python官网下载python3安装包 执行命令:wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 安装zlib-dev ...

  3. Python:python抓取豆瓣电影top250

    一直对爬虫感兴趣,学了python后正好看到某篇关于爬取的文章,就心血来潮实战一把吧. 实现目标:抓取豆瓣电影top250,并输出到文件中 1.找到对应的url:https://movie.douba ...

  4. Tomcat 改端口

    Tomcat 改端口 进入 tomcat 解压包下面的 conf 目录 打开文件 server.xml 找到以下 三处位置,并改为对应端口 1)找到 8005 <Server port=&quo ...

  5. m3u8下载转码一次完成

    最近看到有部分网站开始加入视频解析服务,虽然这种服务会损害土豆优酷等视频托管商的权益,但是,烦人的广告也让我们开始寻找有没有什么比较靠谱的解决方法~实际上很多网站都在使用m3u8文件格式,里面都是视频 ...

  6. 逆向 make 打包错误解决方案 make: *** [internal-package] Error 2

    修改deb.mk文件第6行的压缩方式为gzip vim $THEOS/makefiles/package/deb.mk _THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= ...

  7. Scyther-Semantics and verification of Security Protocol

    1 .本书前一节主要是介作者自己的生平经历(读完感觉作者是个神童),目标明确作者13岁代码已经写的很溜了.自己也开了网络公司,但是后面又专注于自己的计算机基础理论,修了哲学的博士学位(不得不说很多专业 ...

  8. mongodb基本的配置和使用

    一.连接配置,使用自动配置方式,在applicaiton.properties中配置连接信息即可 spring.data.mongodb.host=127.0.0.1 //连接地址 spring.da ...

  9. 论文阅读笔记四十八:Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR2019)

    论文原址:https://arxiv.org/pdf/1809.08545.pdf github:https://github.com/yihui-he/KL-Loss 摘要 大规模的目标检测数据集在 ...

  10. .Net 操作证书文件

    一..Net加签与验签.经过测试,发现使用同一套私钥和公钥,JAVA和.Net可以实现互通 1.1 私钥加签 公钥验签 public void Encode() { try { var path = ...