C语言----------链表的简单实现与操作
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。
由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度(注意这里指的是链表在插入后,无需改变其他元素的内存地址),比另一种线性表(这里指的是数组在某个位置插入后需要将该位置之后的元素都后移一位,因此复杂度为O(n))快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而有序的顺序表相应的时间复杂度分别是O(logn)和O(1)。(前者指的是使用折半查找等方法,后者指的是直接用下标访问数组元素)
链表的简单实现及操作:
#include <stdio.h>
#include <malloc.h> typedef struct node{ //定义节点类型
char data; //数据域
struct node *next; //指针域
}linklist;
linklist* Create(){ //创建链表
char key;
linklist *phead; //头指针
linklist *pnew; //新节点
linklist *pend; //尾指针
phead = (linklist*)malloc(sizeof(linklist));
pend = phead;
puts("请输入你要创建的链表,以$结束");
key=getchar();
while(key!='$'){
pnew = (linklist*)malloc(sizeof(linklist));
pnew ->data = key;
pend ->next = pnew; //新节点插入表尾
pend=pnew; //尾指针指向新表尾
key=getchar();
}
pend->next = NULL; //将尾节点指向的下一节点设置为空
return phead; //返回头指针
}
void Print(linklist *phead){ //打印链表
linklist *p = phead->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}
puts("");
}
linklist* Get(linklist* phead,int pos){ //查找第pos个的节点
int cur = ; //扫描器
linklist *p;
p = phead; //指向头节点
while((p->next!=NULL)&&(cur<pos)){ //不合法或到达尾部则退出
p = p->next;
cur++;
}
return cur==pos?p:NULL;
}
int Locate(linklist* phead,char val){//查找值为val的节点位置
int cur = ,ok = ;
linklist *pnew = phead;
while(pnew->next!=NULL){
if(pnew->data==val){
ok=;
break;
}
pnew=pnew->next;
cur++;
}
return ok==?cur:-;
}
linklist *FindLocate(linklist *phead,int pos){ //查找倒数第K个节点的值
if(pos<=) return NULL; //输入不合法则返回
linklist *pnew = phead;
pos--;
while(pos--){
pnew = pnew -> next;
}
linklist *pnxt = phead;
while(pnew->next!=NULL){
pnew = pnew -> next;
pnxt = pnxt -> next;
}
return pnxt;
}
void DeleteAfter(linklist *p){ //删除p的后继节点
linklist *r;
r = p->next;
p->next = r->next;
free(r);
}
void InsertAfter(linklist *p,char val){//插入p的后继节点
linklist *pnew = (linklist*)malloc(sizeof(linklist));
if(p->next!=NULL){
pnew->next = p->next;
}else{
pnew->next = NULL;
}
pnew ->data = val;
p->next = pnew;
}
void Insert(linklist* phead,int pos,char val){//插入val到位置为pos的节点之后
int cur=;
linklist* p = Get(phead,pos-);
if(p!=NULL){
InsertAfter(p,val);
printf("插入成功!\n当前链表为");
Print(phead);
}else{
puts("插入错误!");
}
}
void Delete(linklist* phead,int pos){ //删除位置为pos的节点
int cur=;
linklist* p =Get(phead,pos-);
if(p!=NULL&&(p->next)!=NULL){
DeleteAfter(p);
printf("删除成功!\n当前链表为");
Print(phead);
}else{
puts("删除错误!");
}
}
void Free(linklist*p){ //释放链表
if(p->next!=NULL){
Free(p->next);
}
free(p);
}
int main(void){
linklist* phead = Create(); //头指针
Print(phead);
int pos;
char val;
puts("请输入你要查找的位置");
scanf("%d",&pos);
linklist* pfind = Get(phead,pos);
if(pfind !=NULL){
printf("该位置值为%c\n",pfind->data);
}
else{
puts("输入错误!");
}
puts("请输入你要查找的值");
scanf(" %c",&val);
int locate = Locate(phead,val);
if(locate==-){
puts("输入错误!");
}else{
printf("该值位置为%d\n",locate);
}
puts("请输入你要查找的倒数第K个值");
scanf("%d",&pos);
pfind = FindLocate(phead,pos);
if(pfind !=NULL){
printf("倒数第K个数值为%c\n",pfind->data);
}
else{
puts("输入错误!");
}
puts("请输入你要删除的位置");
scanf("%d",&pos);
Delete(phead,pos);
puts("请输入你要插入的位置以及值");
scanf("%d %c",&pos,&val);
Insert(phead,pos,val);
Free(phead);
return ;
}
C语言----------链表的简单实现与操作的更多相关文章
- C语言----------链表的简单操作
#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 st ...
- 再次复习数据结构:c语言链表的简单操作
最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...
- 【数据结构与算法】(二) c 语言链表的简单操作
// // main.c // testLink // // Created by lan on 16/3/6. // Copyright © 2016年 lan. All rights reserv ...
- C语言链表操作模板(添加,删除,遍历,排序)
C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...
- ZT C语言链表操作(新增单向链表的逆序建立)
这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- [数据结构]C语言链表实现
我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们 ...
- C语言链表实例--玩转链表
下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...
- Linux C语言链表你学会了吗?
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...
随机推荐
- ConcurrentHashMap实现解析
ConcurrentHashMap是线程安全的HashMap的实现,具有更加高效的并发性.与HashTable不同,ConcurrentHashMap运用锁分离技术,尽量减小写操作时加锁的粒度,即在写 ...
- 洛谷P1858 多人背包 多人背包板子题/多人背包学习笔记
,,,本来自以为,我dp学得还挺好的 然后今天一考发现都不会啊QAQ 连最基础的知识点都不清楚啊QAQ 所以就来写个题解嘛! 先放下板子题 其实我jio得,这题只要大概了解方法就不是很难鸭,,,毕竟是 ...
- Linux知识总汇
Linux相关教程 Linux的安装以及基础配置 Linux上安装Python3 Linux上安装pip以及setuptools Linux上安装MySQL Linux上安装Django Linux上 ...
- day17(JDBC入门&jdbcUtils工具介绍)
day17 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中url ...
- 格式工厂将图片变小,有500kb变为16kb
1:打开格式工厂,选择图片栏>jpg 2:点击添加文件,选择要处理 的图片.点击输出配置,配置转换后 的大小(可手动调整),越小占用空间越少,点击确定 3: 主页面点击转换按钮,转换成功后,显示 ...
- Checkpoint的运行原理和源码实现
引言 Checkpoint 到底是什么和需要用 Checkpoint 解决什么问题: Spark 在生产环境下经常会面临 Transformation 的 RDD 非常多(例如一个Job 中包含1万个 ...
- KL与JS散度学习[转载]
转自:https://www.jianshu.com/p/43318a3dc715?from=timeline&isappinstalled=0 https://blog.csdn.net/e ...
- PAT 1053 Path of Equal Weight[比较]
1053 Path of Equal Weight(30 分) Given a non-empty tree with root R, and with weight Wi assigned t ...
- Linux笔记 #05# 断开远程连接后保持程序运行
教程:Linux 技巧:让进程在后台可靠运行的几种方法 网上搜索了一下,方法很多,选用最流行的 screen 命令参考:http://man.linuxde.net/screen 1. 安装 root ...
- (转载)找圆算法((HoughCircles)总结与优化
Opencv内部提供了一个基于Hough变换理论的找圆算法,HoughCircle与一般的拟合圆算法比起来,各有优势:优势:HoughCircle对噪声点不怎么敏感,并且可以在同一个图中找出多个圆 ...