[BS]线性表之链表基本操作

线性表分为顺序表和链表。

链表的基本操作如下:

#include <stdio.h>
#include <stdlib.h>
#include "list.h"

#define Error( Str )        FatalError( Str )
#define FatalError( Str )   fprintf( stderr, "%s\n", Str ), exit( 1 )

struct Node
{
    ElementType Element;
    Position    Next;
};
/* Make a list empty */
List
MakeEmpty( List L )
{
    if( L != NULL )
        DeleteList( L );
    L = malloc( sizeof( struct Node ) );
    if( L == NULL )
        FatalError( "Out of memory!" );
    L->Next = NULL;
    return L;
}

/* Return true if L is empty */
int
IsEmpty( List L )
{
    return L->Next == NULL;
}

/* Return true if P is the last position int list L */
/* Parameter L is unused in this implementation */
int
IsLast( Position P, List L )
{
    return P->Next == NULL;
}

/* Return Position of X in L; NULL if not found */

Position
Find( ElementType X, List L )
{
    Position P;

    P = L->Next;
    while( P != NULL && P->Element != X )
        P = P->Next;
    return P;
}

/* Delete first occurence of X from a list */
/* Assume use of a header node */

void
Delete( ElementType X, List L )
{
	Position P,TmpCell;

	P = FindPrevious( X, L );

	if( !IsLast( P, L ) )/* Assumption of header use */
	{					 /* X is found ; delete it*/
		TmpCell = P->Next;
		P->Next = TmpCell->Next;
		free( TmpCell);
	}
}

/* If X is not found, then Next field of returned */
/* Position is NULL */
/* Assumes a header */

Position
FindPrevious(ElementType X,List L)
{
	Position P;

	P = L;
	while( P->Next != NULL && P->Next->Element != X )
		P = P->Next;

	return P;
}

/* Insert (after legal position P) */
/* Header implementation assumed */
/* Parameter L is unused in this implementation */
void
Insert( ElementType X, List L, Position P )
{
	Position TmpCell;

	TmpCell = malloc( sizeof( struct Node ) );
	if( TmpCell == NULL )
		FatalError("Out of space!!!");
	TmpCell->Element = X;
	TmpCell->Next = P->Next;
	P->Next = TmpCell;
}

/* Incorrect DeleteList algorithm */
/*void
DeleteList( List L )
{
    Position P;

    P = L->Next;
    L->Next = NULL;
    while( P != NULL )
    {
        free(P);
        P = P->Next;
    }
}*/

/* Correct DeleteList algorithm */
void
DeleteList( List L )
{
    Position P,Tmp;

    P = L->Next;
    L->Next = NULL;
    while( P != NULL )
    {
        Tmp = P->Next;
        free(P);
        P = Tmp;
    }
}

/* Position Header */
Position
Header(List L)
{
    return L;
}

/* Return the First Position Node of list L */
Position
First(List L)
{
    return L->Next;
}

/* Return the Advance of P */
Position
Advance(Position P)
{
    return P->Next;
}

/* Retrive the element of the position P */
ElementType
Retrieve(Position P)
{
    return P->Element;
}

/* Output all elements of list */
void
OutputAllElements( List L )
{
    Position P;
    P = L;
    while( P->Next != NULL )
    {
        printf( "%c ",Retrieve( P->Next ) );
        P = P->Next;
    }
}

/* Insert initial elements of list */
void
InsertInitialElements( ElementType *X, List L ,int n )
{
    while( n-- )
    {
        Insert( *X, L, L );
        *X = *X - 1;
    }
}
/* Main */
int
main(void)
{
    ElementType i = 'z';
    List La = malloc( sizeof( struct Node ) );
    La->Next = NULL;
    MakeEmpty( La );
    InsertInitialElements( &i, La, 26 );
    OutputAllElements( La );
    return 0;
}

Result :

part of list.h

struct Node;/* define ? */

typedef struct Node *PtrToNode;/* 用PtrToNode 代替 struct Node * */

typedef PtrToNode List;/* 用List 代替 PtrToNode */

typedef PtrToNode Position;/*
用Position 代替 PtrToNode */

typedef char    ElementType;/*
用ELementType 代替 char */

时间: 2024-10-06 22:19:51

[BS]线性表之链表基本操作的相关文章

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

C语言 严蔚敏数据结构 线性表之链表实现

博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直接上代码,现阶段代码实现功能有:链表初始化.遍历.增.删.返回链表长度,后续功能陆续发布.其中肯定有很多问题,希望各位码哥留言. Linklist* InitList(int i)//i为链表大小 { Linklist *head; head = (Linklist*)malloc(sizeof(L

[BS]线性表-顺序表基本操作

线性表分为顺序表和链表. 顺序表的基本操作如下: #include <stdio.h> #include <stdlib.h> /*---------------------------------------------*/ #define INIT_VOLUME_OF_LIST 100 #define INCRESE_VOLUME 10 /*---------------------------------------------*/ typedef char ElemType

JAVA实现具有迭代器的线性表(单链表)

一,迭代器的基本知识: 1,为什么要用迭代器?(迭代:即对每一个元素进行一次“问候”) 比如说,我们定义了一个ADT(抽象数据类型),作为ADT的一种实现,如单链表.而单链表的基本操作中,大部分需要用到依次遍历单链表中的每一个元素.一般而言,我们就是用for循环来实现遍历,这样,当你新增一个对单链表的操作并需要使用遍历时,你就得重新写一个for循环而实现遍历.那么,为什么不将迭代(遍历)作为一种基本的ADT操作(基本的ADT操作如:新增一个元素.删除一个元素)呢?于是,迭代器就出场了. 2,鉴于

线性表,线性表和链表的区别

存储类别 顺序存储结构 单链表 存储分配方式 用一段连续的存储单元依次存储线性表的数据元素 采用链式存储结构,用一组任意的存储单元存放线性表的元素 时间性能 查找O(1).插入和删除O(n) 查找O(n).插入和删除O(1) 空间性能 需要预分配存储空间,分大了浪费,小了容易发生上溢 不需要分配存储空间,只要有就可以分配,元素个数不受限制 通过上面的对比,可以得出一些经验性的结论: 若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构.若需要频繁插入和删除时,宜采用单链表结构. 当

线性表之链表2019-11-17

线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的).因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置).由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素. 对于非线性的链表,可以参见相关的其他数据结构,例如树.图.另外有一种基于多个线性链表的数据结构:跳表,插入.删除和查找等基本操

第二章:3.线性表---静态链表的表示和实现

前言: 由于一些高级程序设计语言中,并没有 "指针" 类型,因此上一节中用指针来描述的单链表不能被实现,这时候我们就会使用另一种形式链表:静态链表. 目录: 1.线性表的链式表示和实现 1.1线性链表 单链表(指针型线性链表) 静态链表 1.2循环链表 1.3双向链表 正文: 线性表的静态单链表存储结构: #define MAXSIZE 100; //链表的最大长度 typedef   struct{ ElemType  data; int  cur; }component, SLin

再回首,数据结构——线性表、链表上的常见算法

最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会. 希望这些能提供给初学者一些参考. //1.编写算法实现线性表就地逆置的操作 void InverseList (SeqList l) { for (i = 0; i <= (l.length-1)/2; i++) { l.elem[i] <-> l.elem[l.length-1-i]; } } //2.从顺序表中删除自第i个元素开始的k个元素 void DeleteList(SeqList l, int

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数