step3 . day2 数据结构之线性表链表
今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题。
尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高,几乎不用修改就能测试通过了,make傲娇一小会。
#include <stdio.h>
#include <stdlib.h>
//重定义数据类型名
typedef int datetype;
//链表结构体
typedef struct linklist{
datetype date;
struct linklist *next;
}linklist,*linklist_p;
//链表头创建
linklist_p linklist_creat(){
linklist_p head = NULL;
head = (linklist_p)malloc(sizeof(linklist)); //分配空间
if(!head){
printf("malloc failed\n");
return NULL;
}
// memset(&(head->date),0,sizeof(datetype)); //数据出初始化
head->next = NULL;
return head;
}
//头部插入
void linklist_head_insert(linklist_p head,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
temp->next = head->next;
head->next = temp;
}
//遍历链表
void linklist_show(linklist_p head){
while(head->next != NULL){
printf("%d ",head->next->date);
head = head->next;
}
puts("");
}
//尾部插入
void linklist_tail_insert(linklist_p head,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
temp->next = NULL;
while(head->next !=NULL){
head = head->next;
}
head->next = temp;
}
//按照位置插入
void linklist_pos_insert(linklist_p head,int pos,datetype value){
linklist_p temp = NULL;
temp = linklist_creat();
temp->date = value;
int i = 1;
while(head->next !=NULL && i < pos){
head = head->next;
i++;
}
if(i == pos){
temp->next = head->next;
head->next = temp;
}
else
printf("position illegal\n");
}
//查找
int linklist_search(linklist_p head,datetype value){
int pos = 1;
while(head->next != NULL){
if(head->next->date == value){
return pos;
}
pos++;
head = head->next;
}
return -1;
}
//按值修改
void linklist_value_update(linklist_p head,datetype old,datetype new){
while(head->next != NULL){
if(head->next->date == old){
head->next->date = new;
}
head = head->next;
}
}
//按位置修改
void linklist_pos_update(linklist_p head,int pos,datetype value){
int i=1;
while(head->next != NULL && i<pos){
head = head->next;
i++;
}
if(i == pos && head->next !=NULL){
head->next->date = value;
}
else{
printf("can not find\n");
}
}
//判断是否为空表
int linklist_is_empty(linklist_p head){
return head->next == NULL? 1 : 0;
}
//头部删除
datetype linklist_head_del(linklist_p head){
if(linklist_is_empty(head)){
printf("linklist is empty\n");
return -1;
}
int value = head->next->date;
linklist_p temp = head->next;
head->next = head->next->next;
free(temp);
temp =NULL;
return value;
}
//尾部删除
datetype linklist_tail_del(linklist_p head){
while(head->next->next != NULL){
head = head->next;
}
int value =head->next->date;
linklist_p temp = head->next;
head->next = NULL;
free(temp);
temp = NULL;
return value;
}
//翻转输出
void linklist_reversal(linklist_p head){
linklist_p p,q;
p = head->next;
head->next =NULL;
while(p != NULL){
q = p;
p = p->next;
q->next = head->next;
head->next = q;
}
}
//链表清空
void linklist_clear(linklist_p head){
linklist_p p,q;
p = head->next;
head->next =NULL;
while(p != NULL){
q = p;
p = p->next;
free(q);
q=NULL;
}
}
//排序
void linklist_sort(linklist_p head){
linklist_p p,q,temp;
//p为拆分后待排序链表头指针
//q为排序完成呆释放数据元素
//temp为排序完成最小数据元素比较值指针
p = head->next->next;
head->next->next = NULL; //拆分链表
while(p != NULL){
int pos = 1; //初始插入点
linklist_p temp = head; //定位排序ok初始链表
while(temp->next !=NULL){ //寻找插入点
if(p->date < temp->next->date){
linklist_pos_insert(head,pos,p->date);
q = p;
p = p->next;
free(q);
q = NULL;
break;
}
else{//第一位未找到插入,位置后移,对比值后移
pos++;
temp = temp->next;
}
}
if(temp->next == NULL){ //值大于所以已排序好链表数据元素
linklist_tail_insert(head,p->date);
q = p;
p = p->next;
free(q);
q = NULL;
}
}
}
//删除重复数据
void linklist_repeat_del(linklist_p head){
linklist_p itemp = head->next;
linklist_p jtemp = itemp->next;
linklist_p p = NULL;
while(jtemp){
if(jtemp->date == itemp->date){
itemp->next = jtemp->next;
p = jtemp;
free(p);
p =NULL;
jtemp = jtemp->next;
continue;
}
itemp = itemp->next;
jtemp = itemp->next;
}
}
//按照顺序插入
int main(int argc, const char *argv[])
{
linklist_p list = linklist_creat();
linklist_head_insert(list,4);
linklist_head_insert(list,100);
linklist_head_insert(list,1);
linklist_head_insert(list,2);
linklist_head_insert(list,3);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,7);
linklist_head_insert(list,5);
linklist_head_insert(list,9);
linklist_head_insert(list,100);
linklist_head_insert(list,8);
linklist_head_insert(list,100);
linklist_head_insert(list,6);
// linklist_show(list);
// linklist_tail_insert(list,9);
// linklist_show(list);
// linklist_pos_insert(list,11,100);
// linklist_show(list);
// printf("pos = %d\n",linklist_search(list,8));
// linklist_value_update(list,7,111);
// linklist_show(list);
// linklist_pos_update(list,13,11);
// linklist_show(list);
// printf("%d\n",linklist_head_del(list));
// linklist_show(list);
// printf("%d\n",linklist_tail_del(list));
// linklist_show(list);
linklist_reversal(list);
linklist_show(list);
// linklist_clear(list);
// linklist_show(list);
linklist_sort(list);
linklist_show(list);
linklist_repeat_del(list);
linklist_show(list);
return 0;
}
转载于:https://www.cnblogs.com/huiji12321/p/11228894.html
step3 . day2 数据结构之线性表链表相关推荐
- step3 . day4 数据结构之线性表 栈和队
补充一下:循环链表初学可能不好理解,除了多画图以外,把循环链表想象成无限的单向(或者双向)链表,每一个元素都是中间元素,就更好理解了. 1.栈和队是线性表的两种特殊管理逻辑,两者都是线性表 2.栈的原 ...
- step3 . day1 数据结构之线性表顺序表
大学没有选修数据结构,只是在C语言书最后提到过几种数据的 组织形式,也算眼熟,今天学的顺序表感觉还是很容易理解,写了一个有史以来代码最长.调试时间最短的代码,甚是感觉提高了不少,贴上Mark一下,写注 ...
- step3 . day3 数据结构之线性表 单项循环链表和双向循环链表
1. 使用单项循环链表解决约瑟夫问题: #include <stdio.h> #include <stdlib.h> typedef struct looplist{ int ...
- step3 . day5 数据结构之线性表 栈和队的应用-球钟问题
球钟问题: 球钟是一个利用球的移动来记录时间的简单装置.它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器.若分钟指示器中有2个球,5分钟指示器中有6个球,小时指示器中有5个球,则 ...
- python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...
python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...
- 用Java描述数据结构之线性表的链式存储(链表),模拟LinkedList实现
上一篇介绍了顺序表:用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍 上一篇博客中说明了什么是线性表--线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理 ...
- 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表
线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...
- Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。
数据结构与算法入门 问题1:为什么要学习数据结构 如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...
- c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc
数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...
最新文章
- 利用单臂路由实现VLAN间路由
- 放弃鼠标,提高效率——像用Vim一样使用FF
- Apache访问日志切割
- Mybatis学习之单表增删改查
- 简单使用Boost线程池threadpool
- hive插入数据:FAILED: ParseException line 1:12 missing TABLE at 'student' near 'EOF'
- 使用React,Redux和Router进行真正的集成测试
- vue 手写 移动端 左右滑动 防止上下滑动冲突 超过宽度一半切换
- python打开控制台运行_如何在IPython控制台中默认运行文件而不是终端?
- RabbitMQ的五种模型
- MySQL 和 MySQL Workbench图形化安装教程
- 学术界布局区块链,日本东京大学开始提供区块链课程
- 常见中文停用词表整理
- 浏览器兼容与前端性能优化集合
- 浙江单招单考计算机类本科学校,浙江单考单招能报考哪些大学
- 湖州云计算机,湖州云存储服务_菲尔云计算
- xampp linux 命令,centos 下XAMPP 常用命令
- Effective-Java 谨慎使用流并行
- git push命令详解
- Py:编写程序代码,把自己的微信号变为微信智能机器人自动和你的好友、群友聊天
热门文章
- 腾讯云服务器 linux 镜像安装项目环境mysql心得
- html div p 区别,html中div br p三者有什么区别?
- openFoam源码中的C++
- 开源矿工和轻松矿工接入ssl
- github生成密钥
- define宏定义和const定义之间的区别
- php rpc连接Python,PHP语言之Python、PHP通过xml-rpc进行通信,xml-rpc中文的解决
- DVWA-暴力破解-对‘g0tmi1k’文章的学习笔记
- ubuntu安装/查看已安装包的方法
- [Jarvis OJ - PWN]——[XMAN]level1