当前位置: 首页 > news >正文

数据结构----链表

1.数据结构基本概念

        数据结构:是一组用来保存一种或者多种特定关系的数据的集合,其核心在于如何组织和存储数据。

1.1数据结构的分类

        集合:其中的元素之间关系平等,没有明显的层级或关系链。

        图形结构:元素之间形成多对多的关系,形成网状结构,非常适合表示复杂的关系网络。

        树型结构:元素之间具有一对多的关系,最典型的例子是二叉树,它有效地表达了层级和分支的关系。

        线性结构:元素之间仅存在一对一的关系,线性表(如数组、链表)、队列、栈等都是线性

结构的实现。这些结构的特点是数据项之间有序排列。

        顺序存储:使用一段连续的内存空间来保存元素。其优点是空间连续,访问方便;但缺点是

插入和删除操作需要移动大量元素,且需要预分配内存空间,易造成存储空间碎片。

        链式存储:与顺序存储不同,链式存储采用一组非连续的内存空间来保存元素。每个元素

(或称为节点)除了存储数据外,还包含指向下一个元素的指针(单向链表)或指向前后元素的指

针(双向链表)。优点是插入和删除数据方便,不需要预分配内存;缺点是访问元素效率较低。

其他存储方式

        索引存储:通过关键字构建索引表,快速找到数据的存储位置,提高了数据检索的效率。

        散列存储(哈希存储):将数据元素的存储位置与其关键码之间建立确定的对应关系,实现了快速查找的存储方式。

1.2 示例

link.h


#ifndef __LINK_h__
#define __LINK_h__typedef int DataType;//链表存储数据类型;typedef struct node//链表结点类型;
{DataType date;               //  数据域;struct node *pnext;          //  指针域;
}Link_node_t;typedef struct Link         //链表对象类型;
{Link_node_t *phead;     //链表头结点地址;int clen;               //链表当前结点数;
}Link_t;extern Link_t *create_link();//链表创建;
extern int push_link_head(Link_t *plink,DataType data);
extern void printf_link(Link_t *plink);
extern int push_link_tail(Link_t *plink,DataType data);
extern int pop_link_head(Link_t *plink);
extern int pop_link_tail(Link_t *plink);extern Link_node_t *find_link_data(Link_t *plink, DataType data);
extern int change_link_data(Link_t*plink,DataType data,DataType new_data);
extern int pop_link_all(Link_t * plink);
extern Link_node_t *find_link_end_k_node(Link_t *plink,int k);
extern Link_node_t *find_mid_link_node(Link_t *plink);
extern int delete_link(Link_t *plink , DataType n);#endif

link.c

#include <stdio.h>
#include <stdlib.h>
#include "link.h"Link_t *create_link()
{Link_t *plink = (Link_t *)malloc(sizeof(Link_t));if(NULL == plink){perror("fail malloc");return NULL;}plink->phead = NULL;plink->clen = 0;return plink;
}
int push_link_head(Link_t *plink,DataType data)
{Link_node_t *pnode = (Link_node_t *)malloc(sizeof(Link_node_t));if(NULL == pnode ){perror("fail malloc");}pnode->date = data;pnode->pnext = NULL;pnode->pnext= plink->phead;plink->phead= pnode;plink->clen +=1;
}
void printf_link(Link_t *plink)
{Link_node_t *p = plink->phead;while(p!= NULL){printf("%d  ",p->date);p=p->pnext;}printf("clen = %d\n",plink->clen);
}
int push_link_tail(Link_t *plink,DataType data)
{Link_node_t *pnode = (Link_node_t *)malloc(sizeof(Link_node_t));if(NULL == pnode ){perror("fail malloc");}pnode->date = data;pnode->pnext = NULL;if(plink->phead == NULL){push_link_head(plink,data);}else{Link_node_t *p = plink->phead;while(p->pnext != NULL){p=p->pnext;}p->pnext=pnode;plink->clen+=1;}return 0;
}
int pop_link_head(Link_t *plink)
{Link_node_t *p = plink->phead;if(NULL == plink->phead){return 0;}plink->phead= p->pnext;free(p);plink->clen -=1;return 0;
}
int pop_link_tail(Link_t *plink)
{  Link_node_t *p = plink->phead;if(NULL == plink->phead){return 0;}else if(plink->clen==1){pop_link_head(plink);   }else{while(p->pnext->pnext !=NULL){p=p->pnext;}free(p->pnext);p->pnext = NULL;plink->clen -=1;}return 0;
}Link_node_t *find_link_data(Link_t *plink, DataType data)
{Link_node_t *p = plink->phead;if(plink->clen ==0){return NULL;}else{while(p!= NULL){if(p->date == data){printf("find\n");return p;}p=p->pnext;}printf("no find\n");return NULL;}
}int change_link_data(Link_t *plink,DataType data,DataType new_data)
{Link_node_t *p =find_link_data(plink,data);if(p==NULL){return -1;}p->date =new_data;return 0;
}int pop_link_all(Link_t * plink)
{for(int i =0;i<plink->clen;++i){pop_link_head(plink);}free(plink);return 0;
}Link_node_t *find_mid_link_node(Link_t *plink)
{Link_node_t *p = plink->phead;if(plink->clen ==0){return NULL;}for(int i = 0 ; i < plink->clen / 2; ++i){p = p->pnext;}printf("mid=%d\n",p->date);return p;
}
Link_node_t *find_link_end_k_node(Link_t *plink,int k)
{Link_node_t *p = plink->phead;if(plink->clen ==0){return NULL;}int a = plink->clen-k;if(a<0){return NULL;}else{for(int i = 0 ; i < a; ++i){p = p->pnext;}       printf("k=%d\n",p->date);return p;}
}
int delete_link(Link_t *plink , DataType n)
{if(plink->clen == 0){return 0;}else if(plink->clen == 1){pop_link_head(plink);return 1;}Link_node_t *p = plink->phead;Link_node_t *q = plink->phead;int i = 0;for(i = 0 ; i < n - 1 ; ++i){p = p->pnext;}for(i = 0 ; i < n - 2 ; ++i){q = q->pnext;}q->pnext = p->pnext;free(p);plink->clen--;return 1;
}


http://www.mrgr.cn/news/19108.html

相关文章:

  • 实现一个简单的车贷计算小程序(含代码)
  • cocotb备忘录
  • Flink问题记录
  • 用 count(*)哪个存储引擎会更快?
  • SpringBoot学习(3)(配置文件的基本使用)
  • 配置管理 —— SpringCloud Config
  • 关于位结构体及位操作总结
  • 用ChatGPT三分钟写一个完美的PPT,彻底告别繁琐的制作过程
  • Datawhale X 李宏毅苹果书AI夏令营 学习笔记
  • vector底层原理(二)
  • YOLOv5 结合切片辅助超推理算法 | 这才叫让小目标无处遁形!
  • TCP 拥塞控制
  • Android之Handler的post方法和sendMessage的区别
  • 【Linux操作系统】:Linux生产者消费者模型
  • 大二暑假去龙旗科技(上海)做了两个月软件测试实习生,讲讲我的经历和感受
  • 【2024】Datawhale X 李宏毅苹果书 AI夏令营 Task3
  • ssh安装
  • 华为OD机试 - 最长方连续方波信号(Java 2024 E卷 100分)
  • [SDK]-按钮静态文本与编辑框控件
  • C#中的Array.Sort()和Reverse()