今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题。

尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高,几乎不用修改就能测试通过了,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 数据结构之线性表链表相关推荐

  1. step3 . day4 数据结构之线性表 栈和队

    补充一下:循环链表初学可能不好理解,除了多画图以外,把循环链表想象成无限的单向(或者双向)链表,每一个元素都是中间元素,就更好理解了. 1.栈和队是线性表的两种特殊管理逻辑,两者都是线性表 2.栈的原 ...

  2. step3 . day1 数据结构之线性表顺序表

    大学没有选修数据结构,只是在C语言书最后提到过几种数据的 组织形式,也算眼熟,今天学的顺序表感觉还是很容易理解,写了一个有史以来代码最长.调试时间最短的代码,甚是感觉提高了不少,贴上Mark一下,写注 ...

  3. step3 . day3 数据结构之线性表 单项循环链表和双向循环链表

    1. 使用单项循环链表解决约瑟夫问题: #include <stdio.h> #include <stdlib.h> typedef struct looplist{ int ...

  4. step3 . day5 数据结构之线性表 栈和队的应用-球钟问题

    球钟问题: 球钟是一个利用球的移动来记录时间的简单装置.它有三个可以容纳若干个球的指示器:分钟指示器,五分钟指示器,小时指示器.若分钟指示器中有2个球,5分钟指示器中有6个球,小时指示器中有5个球,则 ...

  5. python线性表和队列_[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列...

    python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构 ...

  6. 用Java描述数据结构之线性表的链式存储(链表),模拟LinkedList实现

    上一篇介绍了顺序表:用Java描述数据结构之线性表的顺序存储(顺序表),ArrayList及其方法的介绍 上一篇博客中说明了什么是线性表--线性表就是一个个数据元素逻辑上以一对一的相邻关系(但是在物理 ...

  7. 数据结构之线性表----一文看懂顺序表、单链表、双链表、循环链表

    ​ 线性表是数据结构中比较基础的内容,不过也是入门的所需要客服的第一个难关.因为从这里开始,就需要我们动手编程,这就对很多同学的动手能力提出了挑战.不过这些都是我们需要克服的阵痛,学习新的知识总是痛苦 ...

  8. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  9. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

最新文章

  1. 利用单臂路由实现VLAN间路由
  2. 放弃鼠标,提高效率——像用Vim一样使用FF
  3. Apache访问日志切割
  4. Mybatis学习之单表增删改查
  5. 简单使用Boost线程池threadpool
  6. hive插入数据:FAILED: ParseException line 1:12 missing TABLE at 'student' near 'EOF'
  7. 使用React,Redux和Router进行真正的集成测试
  8. vue 手写 移动端 左右滑动 防止上下滑动冲突 超过宽度一半切换
  9. python打开控制台运行_如何在IPython控制台中默认运行文件而不是终端?
  10. RabbitMQ的五种模型
  11. MySQL 和 MySQL Workbench图形化安装教程
  12. 学术界布局区块链,日本东京大学开始提供区块链课程
  13. 常见中文停用词表整理
  14. 浏览器兼容与前端性能优化集合
  15. 浙江单招单考计算机类本科学校,浙江单考单招能报考哪些大学
  16. 湖州云计算机,湖州云存储服务_菲尔云计算
  17. xampp linux 命令,centos 下XAMPP 常用命令
  18. Effective-Java 谨慎使用流并行
  19. git push命令详解
  20. Py:编写程序代码,把自己的微信号变为微信智能机器人自动和你的好友、群友聊天

热门文章

  1. 腾讯云服务器 linux 镜像安装项目环境mysql心得
  2. html div p 区别,html中div br p三者有什么区别?
  3. openFoam源码中的C++
  4. 开源矿工和轻松矿工接入ssl
  5. github生成密钥
  6. define宏定义和const定义之间的区别
  7. php rpc连接Python,PHP语言之Python、PHP通过xml-rpc进行通信,xml-rpc中文的解决
  8. DVWA-暴力破解-对‘g0tmi1k’文章的学习笔记
  9. ubuntu安装/查看已安装包的方法
  10. [Jarvis OJ - PWN]——[XMAN]level1