链表中最简单的一种是单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向列表中的下一个节点,而最后一个节点则指向一个空值。


一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接

一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历。

链表最基本的结构是在每个节点保存数据和到下一个节点的地址,在最后一个节点保存一个特殊的结束标记,另外在一个固定的位置保存指向第一个节点的指针,有的时候也会同时储存指向最后一个节点的指针。一般查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。但是也可以提前把一个节点的位置另外保存起来,然后直接访问。当然如果只是访问数据就没必要了,不如在链表上储存指向实际数据的指针。这样一般是为了访问链表中的下一个或者前一个(需要储存反向的指针,见下面的双向链表)节点。

相对于下面的双向链表,这种普通的,每个节点只有一个指针的链表也叫单向链表,或者单链表,通常用在每次都只会按顺序遍历这个链表的时候(例如图的邻接表,通常都是按固定顺序访问的)。

例1,建立链表保存学生的信息,并且可以进行,插入,删除操作,并将学生的信息输出

#include <stdio.h>
#include<malloc.h>
#define LEN sizeof(struct student )
#define NULL 0
struct student
{int num;float score;struct student *next;
};
int n;
//建立链表
struct student *create(void)
{struct student *head, *p1,*p2;n=0;p1=p2=(struct student *)malloc(LEN);scanf("%d %f",&p1->next,&p1->score);head=NULL;while(p1->num!=0){n=n+1;if(n==1) head=p1;    //p1是指向新开辟的结点else p2->next=p1;p2=p1;    //p2指向链表中的最后一个基点p1=(struct student *)malloc(LEN); //开辟新的结点,并且使p1指向他scanf("%d %f",&p1->num,&p1->score);}p2->next=NULL;return (head);
}
//删除结点
struct student *del(struct student  *head,long num)
{struct student *p1,*p2;if(head==NULL)   {printf("\nlist null!\n");goto end;}p1=head;while(num!=p1->num && p1->next!=NULL)   //p1指向不是所要找的结点,并且后面还有结点{p2=p1;p1=p1->next;      //p1后移一个及诶单}       //p1后移一个结点if(num==p1->num)     //找到了{if(p1==head)  head=p1->next;    //若p1指向的是首结点,把第二个结点的地址headelse p2->next=p1->next;      //or 将下一个结点的地址赋给前一个结点地址printf("delete:%d\n",num);n=n-1;free(p1);}else  printf("%dnot been found !\n",num);end:return(head);}
//插入学生信息
struct student *insert(struct student *head ,struct student *stud)
{struct student *p0,*p1,*p2;p1=head;         //使p1指向第一个结点p0=stud;        //p0指向要插入的结点if(head==NULL)     //原来的链表是空表{head=p0,p0->next=NULL; //使p0指向的结点作为头结点}else{while ((p1->num>p1->num)&&(p1->next!=NULL)){p2=p1;     //使p2指向刚才p1指向的及诶按p1=p1->next;    //p1后移一个结点}if(p0->num<=p1->num){if(head==p1)  head=p0;   //插到原来第一个结点之前else p2->next=p0;        //插到p2指向的结点之后p0->next=p1;}else{p1->next=p0;p0->next=NULL;    //插到最后的结点之后}}n=n+1;                            //结点数加1return (head);
}
//输出链表
void print(struct student *head)
{struct student *p;p=head;if(head!=NULL)do{printf("%d %f\n",p->num,p->score);p=p->next;}while(p!=NULL);
}
//main函数
void main()
{struct student *head,stu;long del_num;printf("Input records:\n");head=create();        //建立链表,返回头指针print(head);          //输出全部结点printf("\nInput the deleted number:\n");scanf("%ld",&del_num);       //输入要删除的学号while(del_num!=0){head=del(head,del_num);      //删除后链表的头指针print(head);                       //输出全部结点printf("Input the deleted number:\n");scanf("%ld",&del_num); }printf("\nInput the inserted record:\n");stu=(struct student *)malloc(LEN);scanf("%d %f",&stu->num,&stu->score);     //输入要插入的结点{head=insert(head,&stu);                 //插入一个结点,返回头指针的print(head);                                     //输出全部结点printf("\nInput the inserted record:\n");stu=(struct student *)malloc(LEN);scanf("%d %f",&stu->num,&stu->score);}
}

常见算法:C语言中链表的操作(创建,插入,删除,输出)相关推荐

  1. c语言快速复数的比较大小,c语言中的复数操作

    c语言中的复数操作 发布时间:2020-06-17 14:23:06 来源:亿速云 阅读:391 作者:鸽子 复数在数学运算中十分重要,在编写数值运算或者算法的时候,我们会用到复数这种概念. 那么,复 ...

  2. vs2010c语言复数i怎么表示,学编程应该知道的c语言中的复数操作

    学编程应该知道的c语言中的复数操作 复数在数学运算中十分重要,在编写数值运算或者算法的时候,我们会用到复数这种概念. 那么,复数在C/C++语言中是如何表示的呢?我们接下来一一介绍. C语言中复数 在 ...

  3. 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

    文章目录 一.C 语言中的文件操作函数 二.磁盘与内存缓冲区 三.缓冲区工作机制 一.C 语言中的文件操作函数 读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本 ...

  4. 【C语言复习】C语言中的文件操作

    C语言中的文件操作 写在前面 文件操作 什么是文件 文件的分类 文件名 文件的操作 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 fseek ftell rewind feof 写在前面 ...

  5. R语言中的管道操作——magrittr包

    R语言中的管道操作--magrittr包 一.项目环境 开发工具:RStudio R:3.5.2 相关包:magritter 二.数据准备以及问题阐述 这次要解决的问题是如何使用提取数据框中所有包含缺 ...

  6. C语言-数据结构-单链表的初始化,插入和输出

    [问题描述] 设有头结点单链表,实现单链表的初始化.插入和输出算法. [输入形式] 第一行输入一个N(N大于等于1,小于1000),一个M(N大于等于1,小于1000): 第二行输入N个整数,以空格作 ...

  7. C语言邻接表表示法创建无向图并输出

    C语言邻接表表示法创建无向图并输出 邻接表是图的一种链式存储结构,对图的每个顶点建立一个单链表,单链表第一个结点存放顶点信息,其余存放有关边信息. 邻接表由表头结点表和边表组成. 邻接表存储结构 #i ...

  8. 玩转Mysq数据库(一):数据库的基础操作——创建、删除、查看

    数据库的基础操作 这里通过设立一张图书表带大家熟悉数据库的那些基本操作.后面我们在慢慢循序渐进,到彻底玩转数据库. 针对表的操作 创建表 删除表 查看表 文章目录 数据库的基础操作 针对表的操作 前言 ...

  9. 【算法】Java 中链表的基本操作

      链表是一种重要的数据结构,在工程项目中广泛使用.对于链表,要搞清楚是否有头节点,即第一个节点不存任何数据,只是表示链表的头部,而首节点才是链表第一个真正存放数据的节点.通常情况下,对有头节点的链表 ...

最新文章

  1. 新手C#string类常用函数的学习2018.08.04
  2. 【深度学习】面向医学图像的病灶分割调研(一)
  3. Windows 7玩魔兽争霸冰封王座3的解决方法
  4. LeetCode上稀缺的四道shell编程题解析
  5. LINUX挂接移动硬盘
  6. MySQL三层逻辑架构
  7. 彩信编辑器之预览功能
  8. 判断使用设备是PC还是phone
  9. VSCode解决设置默认浏览器方法(open with live server)
  10. Kettle下载安装使用
  11. 尝试运行项目时出错,无法启动程序 , 由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
  12. 创新创业孵化知识体系-创业实践导论之-技术专栏
  13. Win11耗电严重怎么解决 Win11耗电太快教程
  14. CSS技巧性实现多边形及各种条纹渐变图形
  15. 【日常Exception】第二十七回:Caused by: java.sql.SQLException: Incorrect string value: ‘\xF0\xAC\x8C\x97\xE7\x
  16. Tyvj1474 打鼹鼠
  17. reac-hook的使用
  18. 基于python3+opencv3遥感影像的湖泊边界提取
  19. 饿了么(elementUI)组件库如何在vue项目中使用?
  20. 深职院入职培训心得2021

热门文章

  1. 如何成为一名合格的研究生
  2. How to install Bromine3 RC2
  3. 同等学力计算机综合考试,考点笔记
  4. WordPress添加侧栏小工具-博客统计(网站统计)
  5. 网上订餐项目(附源代码及数据库)
  6. 数学建模视频资源分享
  7. 《古墓丽影8》游戏时atiumdag.dll 崩溃解决方法
  8. 【vue 语音播报(文字转语音)】
  9. 汇编语言【P指令】【T指令】
  10. Jsoup爬虫案例-苏宁易购图片下载