LinkList.h

#pragma once
typedef int DataType;
typedef struct Node {DataType data;struct Node* next;
}ListNode,*LinkList;/*
定义方式:
线性表的链式存储,是采用一组任意的存储单元存放线性表的元素
除了存储元素本身的信息外,还要存储一个指示其直接后继元素的信息(直接后继元素的地址)。
这两个部分构成的存储结构称为节点(node)。即节点包含两个域:数据域和指针域。
通过指针域将线性表中n个节点元素按照逻辑顺序链在一起就构成了链表
LinkList L;
ListNode * L;
*/void InitList(LinkList* head);/*初始化单链表*/
int ListEmpty(LinkList head);
ListNode* GetNode(LinkList head, int i);
ListNode* LocateElem(LinkList head, DataType e);
int LocatePos(LinkList head, DataType e);
int InsertList(LinkList head, int i, DataType e);
int DeleteList(LinkList head, int i, DataType *e);
int ListLength(LinkList head);
void DestoryList(LinkList head);
int DelElem(LinkList A, LinkList B);void PrintList(LinkList head);

LinkList.cpp

#include"LinkList.h"
#include"cstdlib"
#include"cstdio"
void InitList(LinkList* head)/*初始化单链表*/
{if ((*head = (LinkList)malloc(sizeof(ListNode))) == NULL) {/*为头节点分配空间*/exit(-1);}(*head)->next = NULL;/*将头节点的指针域置空*/
}
int ListEmpty(LinkList head)/*单链表为空,返回1,否则,返回0*/ {if (head->next == nullptr) {return 1;}else {return 0;}
}
ListNode* GetNode(LinkList head, int i) {ListNode *p;int j;if (ListEmpty(head) == 1) /*链表为空,返回NULL*/return NULL;if (i < 1) /*序号不合法,返回NULL*/return NULL;j = 0;p = head;while (p->next != NULL && j < i) {p = p->next;j++;}if (j == i) {return p;}    else {return NULL;}}
ListNode* LocateElem(LinkList head, DataType e)
/*按内容查找单链表中元素值为e的元素,
成功则返回对应元素的节点指针,否则返回NULL表示失败*/
{ListNode* p;p = head->next;while (p) {if (p->data != e) {p = p->next;}else {break;}}return p;
}
int LocatePos(LinkList head, DataType e)
/*按内容查找单链表中元素值为e的元素,
成功则返回对应元素的序号,否则返回0表示查找失败*/
{ListNode* p;int i;if (ListEmpty(head) == 1) {return 0;}p = head->next;i = 1;while (p) {if (p->data != e) {p = p->next;i++;}else {return i;}}if (!p) {/*如果没有找到和e相等的元素,返回0*/return 0;}
}
int InsertList(LinkList head, int i, DataType e)
/*在链表第i个位置插入一个结点,结点的元素值为e,插入成功返回1,失败返回0*/ {ListNode* pre, * p;/*定义第i个元素的前驱结点指针是pre,指针p指向新生成的节点*/int j;pre = head;j = 0;while (pre->next != NULL && j < i - 1) /*找到第i-1个节点,即i位置的前驱节点*/{pre = pre->next;j++;}if (j != i - 1) {printf("插入的位置错误\n");return 0;}/*新生成一个节点,并将e赋值给该节点的数据域*/if ((p = (ListNode*)malloc(sizeof(ListNode))) == NULL)exit(-1);p->data = e;/*插入结点的操作*/p->next = pre->next;pre->next = p;return 1;
}
int DeleteList(LinkList head, int i, DataType *e)
/*删除单链表中的第i个位置的结点,删除成功返回1,失败返回0*/
{ListNode *pre, *p;int j;pre = head;j = 0;while (pre->next != NULL && pre->next->next != NULL && j < i - 1) /*判断是否找到前驱结点*/{pre = pre->next;j++;}if (j != i - 1){printf("删除位置有误\n");return 0;}/*指针p指向单链表中的第i个结点,并将该结点的数据域复制给e*/p = pre->next;*e = p->data;/*删除结点*/pre->next = p->next;free(p);}
int ListLength(LinkList head) {ListNode* p;p = head;int count = 0;while (p){p = p->next;count++;}return count;
}
void DestoryList(LinkList head) {ListNode *p,*q;p = head;while (p) {q = p;p = p->next;free(q);}
}int DelElem(LinkList A, LinkList B)
{int i, pos;DataType e;ListNode* p;/*单链表中,取出每个元素和A中的元素比较,如果相等,则删除A中的结点*/for (i = 1; i <= ListLength(B); i++) {p = GetNode(B, i);if (p) {pos = LocatePos(A, p->data);if (pos > 0)DeleteList(A, pos, &e);}}return 0;
}void PrintList(LinkList head)
{ListNode* p;p = head->next;while (p) {printf("%4d", p->data);p = p->next;}printf("\n");
}

单链表在内存中的一个情况:

单链表去重:

void TestLinkList_Dele() {int i;DataType a[] = { 8,17,21,25,27,29 };DataType b[] = { 3,8,9,21,26,27 };LinkList A, B;InitList(&A);InitList(&B);for (i = 1; i <= sizeof(a) / sizeof(a[0]); i++) {InsertList(A, i, a[i - 1]);}for (i = 1; i <= sizeof(b) / sizeof(b[0]); i++) {InsertList(B, i, b[i - 1]);}printf("链表A:\n");PrintList(A);printf("链表B:\n");PrintList(B);DelElem(A, B);printf("去重后的A:\n");PrintList(A);}

合并链表

void MergeList(LinkList A, LinkList B, LinkList C)
{ListNode* pa,*pb;pa = A->next;pb = B->next;int i = 1;while (pa && pb) {if (pa->data < pb->data) {InsertList(C, i, pa->data);pa = pa->next;}else {InsertList(C, i, pb->data);pb = pb->next;}i++;}while (pa) { /*pa 还有剩余*/InsertList(C, i, pa->data);pa = pa->next;i++;}while (pb) { /*pb还有剩余*/InsertList(C, i, pb->data);pb = pb->next;i++;}}

头插法反转链表

void ReverseList(LinkList head,LinkList out)
{ListNode* p;p = head->next;while (p) {InsertList(out, 1, p->data);p = p->next;}
}

02、单链表LinkList相关推荐

  1. C语言基础篇02:单链表实现学生成绩管理系统

    单链表实现学生成绩管理系统 前言 需求分析 详细设计 增加成绩信息 删除成绩信息 修改成绩信息 查询学生信息和浏览学生信息 总结 前言 上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手. ...

  2. 数据结构 02 - 单链表的使用 环形链表的实现与应用

    一.单链表的使用 1.链表 定义:链表是有序的列表 关键点:链表是学树和图的基础 特点: (1)链表是以节点的方式来存储的,即所谓的链式存储 (2)每个节点包含data域和next域,后者的作用是指向 ...

  3. python 单链表节点怎么快速定义_线性表链式存储结构之单链表

    线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置.比起顺序存储结构每个元素只需要存储一个位置就可以了.现在链式存储结构中,除了要存储数 ...

  4. 单链表-史上最清晰的尾插法和头插法

    02.单链表-史上最清晰的尾插法和头插法 1.单链表 链表是一系列的存储数据元素的单元,通过指针(引用)串联起来的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个域是指向其他单元的指针. ...

  5. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  6. 第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)

    /* *Copyright (c) 2017,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:项目3-1.设计一个算法,将一个带头结点的数据域依次为a1,a2,- ...

  7. 第四周实践项目2 算法库——单链表

    /*首先设计测试函数,可以涉及初始化线性表.销毁线性表.输出线性表.插入数据元素对应的函数*/ #include <stdio.h> #include <malloc.h> t ...

  8. 第4周实践项目1 建立单链表(非多组织结构)

    #include <stdio.h> #include <malloc.h> typedef int ElemType; typedef struct LNode //定义单链 ...

  9. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

最新文章

  1. iOS开发多线程篇—自定义NSOperation
  2. 【Python】【入门】一文带你掌握Python27入门 ~
  3. [源码和文档分享]基于C++实现的运动会统分系统
  4. KNN 算法--图像分类算法
  5. KNN实现CIFAR-10数据集识别
  6. openssl 对文本加密解密
  7. 技术人生:给自己安慰的10句温馨话
  8. Flutter进阶—实现动画效果(五)
  9. ArchSummit微课堂|蘑菇街DevOps实践及心路历程分享
  10. Gson解析原理概述
  11. 计算机网络渗透技术(信安一班 李静)
  12. 用IntelliJ IDEA自带的代码对比
  13. 计算机实训报告英语,英文计算机实习证明格式
  14. Yapi的安装与使用
  15. 微博营销的价值与注意点
  16. html设为默认打开方式,设置默认浏览器及默认打开方式设置教程
  17. Android实战——简单网络视频播放器
  18. 推出全新的交互式导航和社交导航 iGibson 挑战
  19. java: 关于反射
  20. Java Log4j和Log4j2的区别

热门文章

  1. 大数据(5a)HBase入门:安装、读写、架构、数据视图、数据模型
  2. mysql的full join_mysql实现full join
  3. 一张图看清客户价值-运用Tableau作RFM客户价值分析
  4. python 使用jieba.analyse提取句子级的关键字
  5. 【OpenCV】数字图像的距离变换算法
  6. 2.知识表示与知识图谱笔记
  7. 视频矩阵系统中三代OSD字符叠加技术全面解析
  8. 你真的理解Java的按引用传递吗?
  9. android 编译 aac,FDK-AAC的android编译
  10. 《Python地理空间分析指南 第2版》学习笔记-5.1 距离测量