链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。

由于不必须按顺序存储,链表在插入的时候可以达到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语言----------链表的简单实现与操作的更多相关文章

  1. C语言----------链表的简单操作

    #include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 st ...

  2. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  3. 【数据结构与算法】(二) c 语言链表的简单操作

    // // main.c // testLink // // Created by lan on 16/3/6. // Copyright © 2016年 lan. All rights reserv ...

  4. C语言链表操作模板(添加,删除,遍历,排序)

    C语言链表操作模板,摘自郝斌的C语言视频教程,简单的修改成了纯C格式.当年照着视频学习的时候记录下来的,在使用的时候直接拿来修改修改修改能节约不少时间的. /********************* ...

  5. ZT C语言链表操作(新增单向链表的逆序建立)

    这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html ZT 链表逆序http://www.cnblogs.com/ ...

  6. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  7. [数据结构]C语言链表实现

    我学数据结构的时候也是感觉很困难,当我学完后我发现了之所以困难时因为我没有系统的进行学习,而且很多教授都只是注重数据结构思想,而忽略了代码方面,为此我写了这些博文给那些试图自学数据结构的朋友,希望你们 ...

  8. C语言链表实例--玩转链表

    下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 n ...

  9. Linux C语言链表你学会了吗?

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

随机推荐

  1. Python-Select/Poll/Epoll使用

    select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使 ...

  2. 《图解HTTP》书摘

    图解HTTP 上野宣.于均良 1.3 网络基础 TCP/IP 2016-03-03 相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎样结束通信 ...

  3. js-jquery-SweetAlert2【二】配置与方法

    一.配置 Argument Default value   Description title null 模态对话框的标题.它可以在参数对象的title参数中设置,也可以在swal()方法的第一个参数 ...

  4. (转)rabbitmq.config详细配置参数

    rabbitmq.config详细配置参数 Key Documentation tcp_listeners 用于监听 AMQP连接的端口列表(无SSL). 可以包含整数 (即"监听所有接口& ...

  5. loadrunner11的移动端性能测试之脚本优化

    测试步骤之脚本优化(Script) 看到这里,是不是疑惑录制好的脚本还需要优化吗,答案是肯定的. 优化概要 脚本优化包括插入注释(Comment),插入事务(Transaction),插入检查点(Ch ...

  6. Python中被双下划线包围的魔法方法

    基本的魔法方法 __new__(cls[, ...]) 用来创建对象 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __i ...

  7. hdu5009

    这题说的是给了一个  长度为n(n<=50000)的数列,数列表示的是给每个珍珠涂的颜色,任务是将一窜长度为n的珍珠涂成他所要的颜色.然后你可以操至多n次, 每次画只能画连续的区间,每次操作是的 ...

  8. cocos2dx 3.x 蒙板 遮罩 点击圆功能

    //注册触摸 EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); listener->onT ...

  9. CSS实现超出DIV宽度文字自动隐藏并显示省略号

    当文字超出DIV宽度时,超出的文字部分省略,并用显示省略号代替,css代码如下: div.ellipsis { padding-left: 5px; text-align: left; text-ov ...

  10. HBase参数优化

    zookeeper.session.timeout默认值:3分钟(180000ms)说明:RegionServer与Zookeeper间的连接超时时间.当超时时间到后,ReigonServer会被Zo ...