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语言链表你学会了吗?
链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...
随机推荐
- rpc、socket、mq
关于RPC与MQ异同的理解 相同:1.都利于大型系统的解耦:2.都提供子系统之间的交互,特别是异构子系统(如java\node等不同开发语言):不同:1.RPC侧重功能调用,因此多半是同步的:备注:也 ...
- 利用GridView实现单选效果
1.实现如图所示的单选效果 由于Android提供的单选按钮radiobutton只能单行或单列显示,且样式并不美观,故可用GridView进行改造,实现单选效果,而要实现这样的效果重点就在GridV ...
- mysql 删除表
删除表 DROP TABLE 表名;
- 因为smb和nfs挂掉导致客户端开机启动不了
因为smb和nfs挂掉导致客户端开机启动不了 虚拟机里的Linux启动不起来 决定开机 按住esc键,看一下到底启动到哪一步出错 从图中可以看出是挂载文件系统的时候出错,文件系统是CIFS, 是sam ...
- centos7 安装python3.6 及模块安装演示
目录: 下载python3.6 安装python3.6的依赖 编译安装 更改链接 更改yum脚本的python依赖 修改gnome-weaktool配置文件 修改urlgrabber配置文件 1.下载 ...
- PAT 1046 Shortest Distance[环形][比较]
1046 Shortest Distance(20 分) The task is really simple: given N exits on a highway which forms a sim ...
- xgboost 自定义评价函数(metric)与目标函数
比赛得分公式如下: 其中,P为Precision , R为 Recall. GBDT训练基于验证集评价,此时会调用评价函数,XGBoost的best_iteration和best_score均是基于评 ...
- 字王·国标二级字库汉字GB内码un码三合一对照表2016版
国标二级字库汉字GB内码un码三合一对照表 字王2016版 汉字内码表,是制作字库的基础,简单.便利的版本很少,根据实战经验,特此制作这个三合一版本的汉字.GB内码.Unicode码对照表: l 提供 ...
- C++虚函数分析
1.虚函数(impure virtual) c++虚函数主要是提供“运行时多态”,父类提供虚函数的默认实现,子类可以虚函数进行重写. 2.纯虚函数(pure virtual) c++纯虚函 ...
- nw.js node-webkit系列(17)怎样打包和分发你的应用
原文链接:http://blog.csdn.net/zeping891103/article/details/50790180