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语言链表你学会了吗?
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...
随机推荐
- s3对象存储
bkstorages 模块帮助你在蓝鲸应用中使用多种文件存储服务作为后端,用于加速静态资源,管理用户上传文件. 自定静态文件 storage 如果通过修改配置文件满足不了你的需求,你随时可以通过继承 ...
- python模拟websocket握手过程中计算sec-websocket-accept
背景 以前,很多网站使用轮询实现推送技术.轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器.轮询的缺点很明显,浏览器需要不断的向服 ...
- SQL Server批量数据导出导入BCP&Bulk使用
数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...
- 【生产问题】write log 引起系统卡死,业务全部阻塞
解决办法:https://www.sqlskills.com/help/waits/writelog/ [生产问题]write log 引起系统卡死,业务全部阻塞 writelog不成功不作数的,所以 ...
- oracle 安装,登陆,配置
1:查看: https://blog.csdn.net/u014177640/article/details/71023380/ 2:登陆 https://zhidao.baidu.com/ques ...
- STL学习笔记--关联式容器
关联式容器依据特定的排序准则,自动为其元素排序.缺省情况下以operator<进行比较.set multiset map multimap是一种非线性的树结构,具体的说是采用一种比较高效的特殊平 ...
- validform.js+layer.js 表单验证样式
$("#formAdd").Validform({ tiptype: function (msg, o, cssctl) { if (o.type == 3) {//失败 laye ...
- C# static的用法详解
C# static的用法详解 有的东西你天天在用,但未必就代表你真正了解它,正如我之前所了解的 static . 一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 n ...
- C++之路
我学习C/C++也有两年了.开始是偏爱C语言和C++的语法特性强大,想用来做游戏开发.在深入学习的同时,逐渐了解到C++可以做很多事.大型项目需要用到运行效率高的C++,虽然运行效率越高,开发效率就要 ...
- 转:常用svn命令
在公司需要提交代码,常用的就是co.ci.add.up.和log 首先 svn help 可以看到 svn 所支持的全部命令: 命令不多,如果用过Tortoise SVN的客户端,从字面上也不难理解这 ...