在单链表中,每个结点包括两部分:存放每个数据元素本身信息的数据域和存放其直接后继存储位置的指针域。

单链表结点的类型描写叙述:

typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}LNode,*LinkList;

单链表的存取必须从头指针開始进行,因此,通经常使用头指针来标识一个单链表。若头指针为空,则表示空链表。

有时,在单链表的第一个结点之前附设一个结点。称之为头结点。

单链表的操作:

1. 单链表的初始化Init_LinkList()

单链表的初始化是建立带头结点的空链表

//初始化运算
LinkList Init_LinkList(){
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}

2.   求单链表的长度Length_LinkList(LinkList L)

//求表长运算
int Length_LinkList(LinkList L){
LinkList p;
int length = 0;
p = L->next;//p指向第一个结点
while(p){
length++;
p = p->next;
}
return length;
}

3.  按序号查找单链表Locate_LinkList_BySeq(LinkList L,int i)

从链表的头指针出发。逐个向后扫描,直到扫描到第i个结点为止。

//按序号定位
LinkList Locate_LinkList_BySeq(LinkList L,int i){
LinkList p = L;
int j = 0;
while(j < i && p->next){
p = p->next;
j++;
}
if(j == i)
return p;
else
return NULL;
}

4. 按值查找单链表Locate_LinkList_ByValue(LinkList L,ElemType e)

从单链表的第i个结点起,顺序扫描单链表,将结点的值和e相比較,直到找到一个和e相等的结点为止。返回该结点的指针。否则。若查遍整个链表找不到这种结点,则返回空指针。

//按值定位
LinkList Locate_LinkList_ByValue(LinkList L,ElemType e){
LinkList p = L->next;
while(p != NULL && p->data != e){
p = p->next;
}
return p;
}

5. 将新结点*s插入到结点*p之后的运算InsertAfter(LinkList p,ElemType e)

//将新结点插入到指定结点之后
void InsertAfter(LinkList p,ElemType e){
LinkList s;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}

6. 将新结点*s插入到结点*p之前InsertBefore(LinkList L,LinkList p,ElemType e)

//将新结点插入到指定结点之前
void InsertBefore(LinkList L,LinkList p,ElemType e){
LinkList s,q;
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
q = L;
//找到p的前驱结点
while(q->next != p)
q = q->next; s->next = p;
q->next = s;
}

7. 在单链表第i个结点之前插入新结点

//将新结点插入到第i个结点之前
void InsertBefore_Seqi(LinkList L,int i,ElemType e){
LinkList p,s;
//找到第i-1个结点
p = Locate_LinkList_BySeq(L,i-1);
if(p == NULL)
printf("i位置不合法");
else{
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}

8.  在单链表第i个结点之后插入新结点

//将新结点插入到第i个结点之后
void InsertAfter_Seqi(LinkList L,int i,ElemType e){
LinkList p,s;
//找到第i个结点
p = Locate_LinkList_BySeq(L,i);
if(p == NULL)
printf("i位置不合法");
else{
s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
}
}

9.  删除*p结点的后继结点DeleteAfter_Nodep(LinkList p)

//删除*p结点的后继结点
void DeleteAfter_Nodep(LinkList p){
LinkList s;
if(p->next == NULL)
printf("当前结点的后继结点为空\n");
else{
s = p->next;
p->next = s->next;
free(s);
}
}

10. 删除*p结点DeleteNodep(LinkList L,LinkList p)

//删除指定结点
void DeleteNodep(LinkList L,LinkList p){
LinkList q;
q = L;
//找到*p的前驱结点
while(q->next != p)
q = q->next;
q->next = p->next;
free(p);
}

11. 删除单链表的第i个结点Delete_Nodei(LinkList L,int i)

//删除单链表的第i个结点
void Delete_Nodei(LinkList L,int i){
LinkList q,p;
//找到第i个结点
q = Locate_LinkList_BySeq(L,i-1);
if(q == NULL)
printf("第i-1个结点不存在\n");
else{
p = q->next;
q->next = p->next;
free(p);
}
}

12.  删除单链表中全部值为e的结点。并返回值为e的结点的个数Delete_Node_Valuee(LinkList L,ElemType e)

//删除单链表中全部值为e的结点。并返回值为e的结点的个数
int Delete_Node_Valuee(LinkList L,ElemType e){
LinkList q,p;
int count = 0;
q = L;
while(q->next != NULL){
p = q->next;
if(p->data == e){
q->next = p->next;
free(p);
}
else
q = p;
}
return count;
}

13. 输出单链表Print_LinkList(LinkList L)

//打印链表
void Print_LinkList(LinkList L){
LinkList p = L->next;
while(p){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}

14. 头插法建立单链表Create_LinkListF(int n)

//头插法建立单链表
LinkList Create_LinkListF(int n){
LinkList L,s;
int i,x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for(i=n;i>0;i--){
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
}
return L;
}

15.  尾插法建立单链表Create_LinkListR(int n)

//尾插法建立单链表
LinkList Create_LinkListR(int n){
LinkList L,s,p;
int i,x;
L = (LinkList)malloc(sizeof(LNode));
p = L;
for(i = n;i > 0;i--){
scanf("%d",&x);
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
p->next = s;
p = s;
}
p->next = NULL;
return L;
}

数据结构(C实现)------- 单链表的更多相关文章

  1. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  2. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  3. PHP数据结构之实现单链表

    学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...

  4. C++ 数据结构学习二(单链表)

    模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...

  5. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  6. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

  7. TZOJ 数据结构实验:单链表元素插入

    描述 实现函数CreateHeader用于创建空链表,实现Insert函数并调用它完成带头节点链表的创建. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkL ...

  8. 分离的思想结合单链表实现级联组件:CascadeView

    本文介绍自己最近做省市级联的类似的级联功能的实现思路,为了尽可能地做到职责分离跟表现与行为分离,这个功能拆分成了2个组件并用到了单链表来实现关键的级联逻辑,下一段有演示效果的gif图.虽然这是个很常见 ...

  9. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  10. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

随机推荐

  1. Linux中常用命令(文件与目录)

    1.pwd 查看当前目录(Print Working Directory) 2.cd 切换工作目录(Change Directory) (1)格式:cd [目录位置] 特殊目录: .当前目录 ..上一 ...

  2. sql查询 按照规定的顺序返回结果集。

    DECODE函数 oracle 独有,功能强大.相当于 if else if IF 条件=值1 THEN RETURN(翻译值1)ELSIF 条件=值2 THEN RETURN(翻译值2) ..... ...

  3. PKI 信息安全三大特性

    [机密性]发送方                                            接收方明文 M                                          ...

  4. Eclipse反编译插件 Enhanced Class Decompiler

    因为jar包中的源码都是经过反编译的,所以需要安装插件才能查看到源码,此处介绍的是 Enhanced Class Decompiler 插件. 打开Eclipse,Help --> Eclips ...

  5. struts2文件上传需要注意的

    ① 必须封装三个字段:文件.文件类型.文件名,而且这三个字段的名字的前面几个字母是一样的 如: private File upload; private String uploadContentTyp ...

  6. js的一些常用判断小实验

    下面是小实验案例 // 0 if(undefined) { console.log('1'); } else { console.log('0'); } // 0 if(null) { console ...

  7. Armbian hostname and WiFi configuration

    In previous post i have described installation of Armbian on Orange Pi PC Plus. Now is the time for ...

  8. PHP写文件到指定位置

    <?php $fp = fopen("output.json", "r+"); $flag = fseek($fp, -3, SEEK_END); if( ...

  9. codeforces 710C Magic Odd Square(构造或者n阶幻方)

    Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...

  10. MVC页面常用方法

    转自:https://www.cnblogs.com/baisoft/p/5839319.html @RenderBody 在Razor引擎中没有了“母版页”,取而代之的是叫做“布局”的页面(_Lay ...