c++链表基本操作
#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++链表基本操作的更多相关文章
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
- c++学习笔记—单链表基本操作的实现
用c++语言实现的单链表基本操作,包括单链表的创建(包括头插法和尾插法建表).结点的查找.删除.排序.打印输出.逆置.链表销毁等基本操作. IDE:vs2013 具体实现代码如下: #include ...
- C++ 双链表基本操作
上一篇博客主要总结了单向链表,这次再总结一下双向链表. 1.概念 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都 ...
- C++ 单链表基本操作
链表一直是面试的高频题,今天先总结一下单链表的使用,下节再总结双向链表的.本文主要有单链表的创建.插入.删除节点等. 1.概念 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数 ...
- 链表基本操作与排序(c语言)
本设计程序用C编写,完成单链表的生成,任意位置的插入.删除,以及确定某一元素在单链表中的位置.实现三种排序算法-冒泡排序.快速排序.合并排序.产生四个长度为100,1000,10000,50000的随 ...
- [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)
题目 203. 移除链表元素 删除链表中等于给定值 val 的所有节点. 题解 删除结点:要注意虚拟头节点. 代码 class Solution { public ListNode removeEle ...
- 转贴:C语言链表基本操作
http://www.oschina.net/code/snippet_252667_27314#comments 这个代码有很多错误,估计是从老谭书上抄来但是很多还抄错了:对照老谭的书好好研究下.切 ...
- java单链表基本操作
/** * */ package cn.com.wwh; /** * @Description:TODO * @author:wwh * @time:2021-1-18 19:24:47 */ pub ...
- Java单链表实现
/** * * 单链表基本操作 * * @author John * */ class LinkList { private Node first; private int pos = 0; publ ...
随机推荐
- PHP 常用知识点
@多台服务器共享 session 方案用户量很大,单台 Redis 根本就放不下怎么办?服务器端分布式存储了(Redis 集群. Memcached 集群),既然是分布式,那么就必须保证用户每次请求都 ...
- Java基础11-List;Set;Map
作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...
- Spring Cloud 2-RabbitMQ 集成(八)
Spring Cloud RabbitMQ pom.xml application.yml 提供者 消费者 队列配置 单元测试 通过消息队列MQ做为通信中心,这里采用RabbitMQ.安装方参考: ...
- ffmpeg推流方式采用TCP协议
ffmpeg默认推流方式采用UDP方式,若需要使用TCP协议,则需要修改. 1.使用命令时: ffmpeg 跟参数 -rtsp_transport tcp 2.编码时 AVFormatContext ...
- 【转载 | 笔记】IIS无法删除应该程序池 因为它包含X个应用程序
IIS无法删除应该程序池 因为它包含X个应用程序 今天代码主分支在vs2015创建了虚拟目录http://localhost/webapp指向的物理路径是E:\webapp 之后新开了一个分支把代码放 ...
- habse Region server挂掉
2019-04-28 15:57:28,355 INFO org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPe ...
- Ipa 脱壳工具 Clutch dumpdecrypted 使用
1 Clutch 使用 下载地址 : https://github.com/kjcracks/clutch/releases 下载之后去掉去掉版本号 拖入手机的 /usr/bin/ 目录下 执行 c ...
- docker环境下elasticsearch安装ik和拼音分词
elasticsearch拼音分词地址:https://github.com/medcl/elasticsearch-analysis-pinyin/releases 在elasticsearch下面 ...
- Python base64编码,转图片
我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...
- 在webAPI的BaseController上使用RoutePrefix
在webAPI2.2中有支持,参考地址:https://docs.microsoft.com/en-us/aspnet/web-api/overview/releases/whats-new-in-a ...