链表问题大全!!!刚出炉的还热乎呢!!

#include

#include

typedef struct node

{

int nDate;

struct node *pstnext;

}Node;

//链表输出

void output(Node *head)

{

Node *p = head->pstnext;

while(NULL != p)

{

printf("%d ", p->nDate);

p = p->pstnext;

}

printf("\r\n");

}

//链表建立

Node* creat()

{

Node *head = NULL, *p = NULL, *s = NULL;

int Date = 0, cycle = 1;

head = (Node*)malloc(sizeof(Node));

if(NULL == head)

{

printf("分配内存失败\r\n");

return NULL;

}

head->pstnext = NULL;

p = head;

while(cycle)

{

printf("请输入数据且当输入数据为0时结束输入\r\n");

scanf("%d", &Date);

if(0 != Date)

{

s = (Node*)malloc(sizeof(Node));

if(NULL == s)

{

printf("分配内存失败\r\n");

return NULL;

}

s->nDate = Date;

p->pstnext = s;

p = s;

}

else

{

cycle = 0;

}

}

p->pstnext = NULL;

return(head);

}

//单链表测长

void length(Node *head)

{

Node *p = head->pstnext;

int j=0;

while(NULL != p)

{

p = p->pstnext;

j++;

}

printf("%d\r\n", j);

}

//链表按值查找

void research_Date(Node *head, int date)

{

Node *p;

int n=1;

p = head->pstnext;

while(NULL != p && date != p->nDate)

{

p = p->pstnext;

++n;

}

if(NULL == p)

{

printf("链表中没有找到该值");

}else if(date == p->nDate)

{

printf("要查找的值%d在链表中第%d个位置\r\n", date, n);

}

return;

}

//按序号查找

void research_Number(Node *head, int Num)

{

Node *p=head;

int i = 0;

while(NULL != p && i < Num)

{

p = p->pstnext;

i++;

}

if(p == NULL)

{

printf("查找位置不合法\r\n");

}else if(i == 0)

{

printf("查找位置为头结点\r\n");

}else if(i == Num)

{

printf("第%d个位置数据为%d\r\n", i, p->nDate);

}

}

//在指定元素之前插入新结点

void insert_1(Node *head, int i, int Newdate)

{

Node *pre = head, *New = NULL;

int j = 0;

while(NULL != pre && j < i-1)

{

pre = pre->pstnext;

j++;

}

if(NULL == pre || j > i-1)

{

printf("插入位置不存在\r\n");

}else

{

New = (Node*)malloc(sizeof(Node));

if(NULL == New)

{

printf("分配内存失败\r\n");

return;

}

New->nDate = Newdate;

New->pstnext = pre->pstnext;

pre->pstnext = New;

}

}

//在指定元素之后插入新结点

void insert_2(Node *head, int i, int Newdate)

{

Node *pre = head, *New = NULL;

int j = 0;

while(NULL != pre->pstnext && j < i)

{

pre = pre->pstnext;

j++;

}

if(j == i)

{

New = (Node*)malloc(sizeof(Node));

if(NULL == New)

{

printf("分配内存失败\r\n");

return;

}

New->nDate = Newdate;

New->pstnext = pre->pstnext;

pre->pstnext = New;

}else

{

printf("插入位置不存在\r\n");

}

}

//删除第一个结点

void delete_list(Node *head)

{

Node *p = head->pstnext;

head->pstnext = p->pstnext;

free(p);

}

//删除指定结点

void Delete_1(Node *head, int i3)

{

Node *p = head, *pre = NULL;

int j = 0;

while(NULL != p && j < i3)

{

pre = p;

p = p->pstnext;

j++;

}

if(NULL == p)

{

printf("删除位置不存在\r\n");

}else

{

pre->pstnext = p->pstnext;

free(p);

}

}

//指定删除单链表中某个数据,并统计删除此数据的个数

int Delete_2(Node *head, int Delete_date)

{

int count = 0;

Node *p = head, *q;

while(NULL != p->pstnext)

{

q = p->pstnext;

if(q->nDate == Delete_date)

{

p->pstnext = q->pstnext;

free(q);

++count;

}

else

{

p = q;

}

}

return count;

}

//链表逆置

void Reverse_list(Node *head)

{

Node *q, *s;

if(NULL == head->pstnext || NULL == head->pstnext->pstnext)

{

return;

}

q = head->pstnext->pstnext;

head->pstnext->pstnext = NULL;

while(NULL != q)

{

s = q->pstnext;

q->pstnext = head->pstnext;

head->pstnext = q;

q = s;

}

}

//单链表的连接

void connect_list(Node *head, Node *head_New)

{

Node *p = head;

while(NULL != p->pstnext)

{

p = p->pstnext;

}

p->pstnext = head_New->pstnext;

}

void main()

{

int date, num; //待查找数据

int i3; //指定删除元素的位置

int i1, i2, Newdate_1, Newdate_2; //待插入的新数据

int Delete_date, k; //待删除的数据与其个数

Node *Head = NULL; //定义头结点

Node *Head_New = NULL;

//链表建立

Head = creat();

printf("输出建立的单链表\r\n");

output(Head);

//单链表测长

printf("单链表长度为\r\n");

length(Head);

//链表按值查找

printf("请输入待查找的数据\r\n");

scanf("%d", &date);

research_Date(Head, date);

//链表按序号查找

printf("请输入待查找序号\r\n");

scanf("%d", &num);

research_Number(Head, num);

//在指定第i1个元素之前插入新元素Newdate

printf("在指定第i个元素之前插入新元素Newdate");

printf("请输入i与元素且以逗号间隔\r\n");

scanf("%d,%d", &i1, &Newdate_1);

insert_1(Head, i1, Newdate_1);

printf("插入后新链表\r\n");

output(Head);

//在指定第i2个元素之后插入新元素Newdate

printf("在指定第i个元素之后插入新元素Newdate");

printf("请输入i与元素且以逗号间隔\r\n");

scanf("%d,%d", &i2, &Newdate_2);

insert_2(Head, i2, Newdate_2);

printf("插入后新链表\r\n");

output(Head);

//删除链表第一个结点

delete_list(Head);

printf("输出删除后的链表\r\n");

output_list(Head);

//指定删除i3元素

printf("删除元素的位置\r\n");

scanf("%d", &i3);

Delete_1(Head, i3);

printf("删除后新链表\r\n");

output(Head);

//指定删除单链表中某个数据,并统计删除此数据的个数

printf("请输入待删除的元素\r\n");

scanf("%d", &Delete_date);

k = Delete_2(Head, Delete_date);

printf("删除后新链表\r\n");

output(Head);

printf("删除指定元素在链表中的个数为:");

printf("%d\r\n", k);

//单链表逆置

Reverse_list(Head);

printf("逆置后输出\r\n");

output(Head);

//单链表的连接

printf("建立一个新链表\r\n");

Head_New = creat();

printf("输出新链表");

output(Head);

printf("将新链表连接到原来链表的尾部并输出\r\n");

connect_list(Head, Head_New);

output(Head);

return;

}

python实现带头结点的单链表的就地逆置_设头指针为head,编写算法实现带头结点单链表head的就地逆置...相关推荐

  1. 无头结点单链表的逆置_无头节点的链表.PPT

    无头节点的链表.PPT 链表的排序(按照升序排列) 不同于数组,链表的排序不用改变每个节点里面的值,只需要改变节点和节点之间的连接关系. 思路1,类似选择排序,每次找出最小的,脱离原链表,插入在另一个 ...

  2. 链表、头指针、头结点

    图1为线性表(ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG)的逻辑状态.头指针 指示链表中第一个结点(即第一个数据元素的存储映像)的存储位置.同时,由于最后一个 ...

  3. 怎么样让指针指向尾结点C语言,带头结点头指针与带头结点尾指针的学习

    单循环链表 对于单链表而言,如果每次在遍历到单链表中间处时需要遍历整个链表,此时只能往后遍历,前方的指针便会丢失.如图1所示,此时若链表遍历到a2处依旧可以通过尾结点循环到a1处,这是单链表所不能解决 ...

  4. 可由一个尾指针唯一确定的链表有_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表单链表双向链表循环链表双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存储结构 ...

  5. 算法与数据结构(part6)--单向链表

    学习笔记,仅供参考,有错必纠 参考自:单链表头指针.头结点.头元结的辨析 文章目录 算法与数据结构–基于python 链表 为啥需要链表 什么是链表 单向链表 什么是单向链表 单列表的操作 节点的实现 ...

  6. 严蔚敏算法约瑟夫环_极客算法训练笔记(三),链表详细图解,别再逃避了朋友...

    目录 缓存引爆链表 链表 单链表 双向链表 循环链表 双向循环链表 LinkedHashMap实现LRU缓存,源码解析(JDK1.8) 算法 爬楼梯 算法 反转链表 算法 链表环检测 缓存引爆链表 存 ...

  7. 用c语言实现数据结构算法将两个有序链表并为一个有序链表的算法,,(完整版)数据结构-习题集答案-(C语言版严蔚敏)...

    } 2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n.试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连 ...

  8. 【头结点】【头指针】【首元结点】

    2022 -1-14 文章目录 2022 -1-14 1. 定义: 2. 哨兵(头结点) 3. 有无头结点的单链表的创建 3.1 有头结点 3.1.1 头插法: 3.1.2 尾插法: 3.2 无头结点 ...

  9. 如何删除链表的最后一个节点_面试:删除链表的节点

    给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点.返回删除后的链表的头节点.注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5 输出: [4 ...

最新文章

  1. JavaScript对象
  2. 树莓派python实例_树莓派3 搭建 django 服务器的实例
  3. 01-JDBC概念--JDBC(Java Database Connectivity:Java数据库连接):使用jdbc实现Java与数据库MySQL连接
  4. canal原理的一些学习-1(canal的一些原理性介绍)
  5. 第三次学JAVA再学不好就吃翔(part11)--基础语法之switch语句
  6. 异常处理、socke基于TCP协议编程
  7. springboot 注解动态赋值_SpringBoot 使用 @Value 注解读取配置文件给静态变量赋值
  8. Java面试题,java工程师求职简历
  9. 征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备
  10. 我爱Java系列---【EL和JSTL】
  11. java dao接口_java web项目中dao和service前面为什么要有接口呢??
  12. paip.提升性能---mysql 优化cpu多核以及lan性能的关系.
  13. 计算机组成原理学习通题目汇总
  14. 对M/M/N排队论模型的matlab代码实现
  15. ffmpeg处理YUV422和YUV420P相互转换
  16. Linux应用层24点小游戏,C++ Builder构建算二十四点小游戏
  17. 【老文档】20190331省电功能性文档
  18. SpringBoot、SpringCloud版本中GA/PRE/SNAPSHOT的详解
  19. html5 ogv格式转换,ffmpeg – Mac上的HTML5视频OGV转换
  20. c语言 字符转二进制输出,C语言 如何把一个ASCII码转换为二进制输出?

热门文章

  1. 一秒学会给自己的PDF文档加密!
  2. 战损版用C/C++解一元一次方程组
  3. 什么是Webquest?
  4. 2020ChinaJoy全是小姐姐,程序员小伙当场流鼻血
  5. Commvault Oracle备份常用命令
  6. Linux进阶之综合练习
  7. 根据抖音账号的分享链接下载无水印视频
  8. ict测试软件介绍,什么是ICT测试技术
  9. Google发布RAISR
  10. 满意度调查的几种常用方法