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

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

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

由于不必须按顺序存储,链表在插入的时候可以达到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基础之递归、二分法

    一 递归 1. 必须有一个明确的结束条件2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结 ...

  2. Qt::浅谈信号槽连接,参数在多线程中的使用

    Qt的信号槽有五种连接方式定义在enum Qt::ConnectionType,下面简单介绍 Qt::AutoConnection:自动判断连接方式,如果信号发送对象和执行槽对象在同一线程,那么等于Q ...

  3. 201-React顶级API

    一.概述 React是React库的入口点.如果您从<script>标记加载React,则这些顶级API可在React全局中使用.如果你使用npm的ES6,你可以写:import Reac ...

  4. phpstorm psr2样式.xml

    将如下内容保存为 .xml 格式 <code_scheme name="Default"> <PHPCodeStyleSettings> <optio ...

  5. linux的浅谈io操作

    系统默认设定 名称类型文件描述符操作标准输入standard input0<,<< 标准输出standard output1>,>> 标准错误输出standard ...

  6. 全自动照片美化软件Photolemur mac特别版

    今天小编为大家带来的是世界上首个支持全自动照片美化的软件Photolemur mac特别版.Photolemur中文特别版采用了全新的人工智能AI系统,它能够全自动智能的对您的照片进行曝光.亮度.降噪 ...

  7. JDBC NOTE

    JDBC 基本流程: 1. 加载驱动 a. SQLSERVER:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver&quo ...

  8. 已有模板与tp框架的结合 (前台)

    已有模板与tp框架的结合 具体步骤   A.复制模板文件到view指定目录 B. 复合css .js.img.静态资源文件到系统指定目录 C. 把静态资源(css,js,img)文件的路径设置为“常量 ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 Solution

    A. Hard to prepare 题意:有n个客人做成一圈,有$2^k$种面具,对于每种面具有一种面具不能使相邻的两个人戴,共有多少种做法. 思路: 把题意转化成相邻的人不能带同种面具.总数为$( ...

  10. Object-C开发之instancetype和id关键字

    一.什么是instancetypeinstancetype是clang 3.5开始,clang提供的一个关键字,表示某个方法返回的未知类型的Objective-C对象.我们都知道未知类型的的对象可以用 ...