#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. PHP 常用知识点

    @多台服务器共享 session 方案用户量很大,单台 Redis 根本就放不下怎么办?服务器端分布式存储了(Redis 集群. Memcached 集群),既然是分布式,那么就必须保证用户每次请求都 ...

  2. Java基础11-List;Set;Map

    作业解析: remove(int index); //删除指定位置的元素 List list = new ArrayList(); list.add("s1"); list.add ...

  3. Spring Cloud 2-RabbitMQ 集成(八)

    Spring Cloud  RabbitMQ  pom.xml application.yml 提供者 消费者 队列配置 单元测试 通过消息队列MQ做为通信中心,这里采用RabbitMQ.安装方参考: ...

  4. ffmpeg推流方式采用TCP协议

    ffmpeg默认推流方式采用UDP方式,若需要使用TCP协议,则需要修改. 1.使用命令时: ffmpeg 跟参数 -rtsp_transport tcp 2.编码时 AVFormatContext ...

  5. 【转载 | 笔记】IIS无法删除应该程序池 因为它包含X个应用程序

    IIS无法删除应该程序池 因为它包含X个应用程序 今天代码主分支在vs2015创建了虚拟目录http://localhost/webapp指向的物理路径是E:\webapp 之后新开了一个分支把代码放 ...

  6. habse Region server挂掉

    2019-04-28 15:57:28,355 INFO org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPe ...

  7. Ipa 脱壳工具 Clutch dumpdecrypted 使用

    1  Clutch 使用 下载地址 : https://github.com/kjcracks/clutch/releases 下载之后去掉去掉版本号 拖入手机的 /usr/bin/ 目录下 执行 c ...

  8. docker环境下elasticsearch安装ik和拼音分词

    elasticsearch拼音分词地址:https://github.com/medcl/elasticsearch-analysis-pinyin/releases 在elasticsearch下面 ...

  9. Python base64编码,转图片

    我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...

  10. 在webAPI的BaseController上使用RoutePrefix

    在webAPI2.2中有支持,参考地址:https://docs.microsoft.com/en-us/aspnet/web-api/overview/releases/whats-new-in-a ...