本程序实现的单链表是带头结点的单链表,头结点相当于一个全局变量。
本程序利用了C++的模板功能。

1、指定位序插入
2、清空线性表
3、查询元素
4、指定位序删除
5、遍历
6、指定位序元素获取
7、线性表长度获取

LinkList.h

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;//模板
template<typename DataType>
struct LinkNode
{DataType data;struct LinkNode* next;
};//线性表的头结点定义,不同于一般的数据节点,相当于是一个全局变量
template<typename DataType>
struct LinkList
{LinkNode<DataType>* head;    //L是头结点,head是头指针?int length;
};//线性表的初始化操作
template<typename DataType>
void InitList(LinkList<DataType> &L)
{L.length = 0;L.head = NULL;
}//线性表指定位序插入
template<typename DataType>
Status ListInsert(LinkList<DataType> &L,int i,DataType e)
{//合法性检验if (i > L.length + 1 || i < 0)return FALSE;//申请一个结点,并进行初始化设置LinkNode<DataType>* p = new LinkNode<DataType>;//内存分配失败if (!p) return FALSE;//初始化新结点p->next = NULL;p->data = e;if (i == 1) //1位置进行特殊处理,即插入头结点之后{p->next = L.head;       //p指向首结点L.head = p;}else{//先找到第i-1个结点,然后再该位置插入LinkNode<DataType>* q = L.head;for (int k = 0; k < i - 1; k++){q = q->next;}p->next = q->next;q->next = p;}L.length++;return OK;
}//线性表头位置插入,相当于在第一个位置插入
template<typename DataType>
Status InsFirst(LinkList<DataType>& L,DataType e)
{return ListInsert(L,1,e);
}//线性表尾位置插入,相当于在最后一个位置插入
template<typename DataType>
Status InsLast(LinkList<DataType>& L,DataType e)
{return ListInsert(L,L.length+1,e);
}//清空线性表
template<typename DataType>
Status ClearList(LinkList<DataType>& L)
{LinkNode<DataType>* p = L.head;     //p指向头结点while (p){L.head = p->next;delete p;                //释放结点空间p = L.head;}return OK;
}//查询元素, compare为查询操作所用的比较操作
template<typename DataType>
int LocateElem(LinkList<DataType>& L, DataType e, bool(*compare)(DataType, DataType))
{LinkNode<DataType>* p = L.head;int k = 1;while (p){if (*compare(p->data, e)) return k;k++;p = p->next;}return FALSE;
}//删除指定位序元素
template<typename DataType>
Status ListDelete(LinkList<DataType>& L, int i, DataType& e)
{//i的合法性检验if (i < 0 || i > L.length)return FALSE;LinkNode<DataType>* p = L.head;       //p指向第几个结点//第一个结点特殊处理if (i == 1){L.head = p->next;e = p->data;        delete p;           //释放p指向的空间}else{//先找到要删除第i-1个结点for (int k = 0; k < i - 1; k++){p = p->next;}//p指向第i - 1个结点LinkNode<DataType>* q = p->next;  //q指向第i个结点p->next = q->next;delete q;}return OK;
}//遍历线性表
template<typename DataType>
void ListTraverse(LinkList<DataType>L,void(*visit)(DataType e))
{LinkNode<DataType>* p = L.head;while (p){(*visit)(p->data);p = p->next;}
}//获取指定位序元素
template<typename DataType>
Status GetElem(LinkList<DataType>L,int i,DataType &e)
{if (i < 1 || i > L.length)return FALSE;LinkNode<DataType>* p = L.head;for (int k = 1; k < i; k++){p = p->next;}e = p->data;return OK;
}//获取线性表长度
template<typename DataType>
int ListLength(LinkList<DataType> L)
{return L.length;
}

main.cpp

//编程环境: vs 2019
#include "LinkList.h"
typedef struct Student
{char sno[20];int G;
}Student;char fileName[] = "stu.txt";//定义学生信息结构体的比较函数
bool compare(Student e1, Student e2)
{if (e1.G == e2.G && strcmp(e1.sno, e2.sno))return true;return false;
}//定义学生结构体的遍历操作,本实例程序中定义为简单的打印
void visit(Student e)
{printf("学号%s,成绩%d \n",e.sno,e.G);
}//从控制台中输入一个学生信息
bool readStudent(Student &e)
{printf("输入学生的学号和成绩信息,用空格隔开\n");scanf("%s %d",e.sno,&e.G);getchar();return true;
}//把学生信息存储到文件的操作
void savetoFile(LinkList<Student>L)
{Student e;FILE* f = fopen(fileName,"w");for (int k = 0; k < L.length; k++){GetElem(L,k + 1,e);fprintf(f,"%s %d\n",e.sno,e.G);}fclose(f);
}int main()
{LinkList<Student> L;InitList(L);char command = 'n';bool out = false;char tmp[256];Student e;while (!out){printf("save to file(s)\n");printf("insert into List(i)\n");printf("delete from List(d)\n");printf("clear List(c)\n");printf("print List(p)\n");printf("exit system(e)\n");gets_s(tmp);command = tmp[0];switch (command){case 's':savetoFile(L); break;case 'i':readStudent(e);InsFirst(L,e); break;case 'd':ClearList(L); break;case 'c':ListDelete(L, 2, e); break;case 'p':ListTraverse(L,visit); break;case 'e':out = true; break;default:printf("error command\n");break;}}ClearList(L);return 0;
}

单链表基本操作代码实现【数据结构笔记】相关推荐

  1. 数据结构-单链表基本操作-C语言代码

    单链表基本操作 1.头插法建立单链表 2.尾插法建立单链表 3.查找结点 3.修改结点 4.插入结点 5.删除结点 本篇只有c语言代码,具体思路讲解请看这篇博客:数据结构-线性结构-单链表 1.头插法 ...

  2. 浅谈:数据结构之单链表,java代码演示单链表

    单链表 本文是观看尚硅谷韩老师视频学习总结,部分来源网络. 单链表介绍 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每 ...

  3. 【数据结构|链表】单链表基本操作

    文章目录 一.链表 二.链表分类 三.单链表基本操作   3.1 单链表存储结构Init   3.2 遍历链表visitlist函数   3.3 求表长length   3.4 查找listfind ...

  4. 【数据结构-C】单链表基本操作及图解分析

    目录 单链表介绍​ 单链表基本操作及图解分析 1.创建一个新结点 2.头插法向单链表中插入结点​ 3. 尾插法向单链表中插入结点​ 4.头删法删除单链表结点​ 5.尾删法删除单链表结点​ 6.返回单链 ...

  5. C语言单链表基本操作总结

    C语言单链表基本操作     本文是参考他人实现的C语言单链表,对多篇博文整理的结果,仅作为学习笔记.文末有参考出处. 1.单链表定义 链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单 ...

  6. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

  7. C 语言单链表基本操作

    复习下数据结构,使用 C 语言实现了带头节点的单链表.单链表基本操作有:节点初始化.链表初始化.插入节点.查找节点.删除节点和删除链表等.下面的程序中,list.h 为头文件, 其中包含了上述基本操作 ...

  8. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

  9. 237删除链表中的节点(单链表基本操作)

    1.题目描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 说明: 链表至少包含两个节点. 链表中所有节点的值都是唯一的. 给定的节点为非末尾节点并且一定 ...

最新文章

  1. Linux之facl
  2. LaTex中的documentclass{type}应该填什么
  3. C++ primer学习方法
  4. Android入门(九)文件存储与SharedPreferences存储
  5. VMware-使用VMware在本地搭建多个CentOS虚机
  6. ssm使用全注解实现增删改查案例——IEmpService
  7. 沈梦辰回应闲鱼卖假货事件:负责到底 不做一锤子买卖
  8. 戴尔修复已存在12年之久的驱动漏洞,影响数百万个人电脑
  9. JavaScript基础知识(一)
  10. 读美国教授写给被开除中国留学生的信感悟
  11. 计算机c盘如何扩大,C盘太小怎么办?教你扩大容量!
  12. 远程医疗作用_是远程医疗保健的未来
  13. 09-新闻发布系统数据库-管理角色数据操作
  14. 影响网站排名的几大因素
  15. redis的数据库通知(notify-keyspace-events)
  16. 使用RT-Thread Studio DIY 迷你桌面时钟| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)...
  17. jenkins cicd k8s 多分支流水线构建
  18. 今日金融词汇---BP
  19. qt QLabel设置行间距
  20. 微信屏蔽二维码下载APK 手机APP应用 如何解决

热门文章

  1. 小作坊加工什么挣钱?哪些方面利润不错?
  2. LED显示器和传统CRT显示器的概念与对比
  3. 盛大 sina 共同的选择:开曼群岛
  4. 人工智能初学者入门相关题型
  5. qspi AHB总线学习 - 01
  6. 创业书籍推荐,这些书经商必读
  7. 【webpack】1
  8. XFS文件系统的优点及缺点
  9. 小程序源码提取工具 完美解包,最新脚本,一键提取小程序源代码工具
  10. 年轻人必读:惠普前总裁孙振耀谈工作