线性表带头结点的单链表的链式表示和实现

带有头结点的单链表的12个基本操作

#define DestroyList ClearList//DestroyList()和ClearList()的操作是一样的

void InitList(LinkList &L){
    L = NULL;
}

void ClearList(LinkList &L){
    LinkList p;
    while (L){
        p = L;
        L = L->next;
        free(p);
    }
}

Status ListEmpty(LinkList L){
    if (L)return FALSE;
    else return TRUE;
}

int ListLength(LinkList L){
    LinkList p = L;
    int i = 0;
    while (p)
    {
        i++;
        p = p->next;
    }
    return i;
}

Status GetElem(LinkList L, int i, ElemType &e){
    int j = 1;
    LinkList p = L;
    if (i < 1)return ERROR;
    while (j < i && p){
        j++;
        p = p->next;
    }
    if (j == i && p){
        e = p->data;
        return OK;
    }
    return ERROR;
}

int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){
    int i = 1;
    LinkList p = L;
    while (p){
        i++;
        if (compare(p->data, e))
            return i;
        p = p->next;
    }
    return 0;
}

Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e){
    LinkList q, p = L;
    while (p->next){
        q = p->next;
        if (q->data == cur_e){
            pre_e = p->data;
            return OK;
        }
        p = q;
    }
}

Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e){
    LinkList p = L;
    while (p->next){
        if (p->data == cur_e){
            next_e = p->next->data;
            return OK;
        }
        p = p->next;
    }
    return ERROR;
}

Status ListInsert(LinkList L, int i, ElemType e){
    int j = 1;
    LinkList s, p = L;
    if (i < 1)return ERROR;
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    if (i == 1){
        s->next = L;
        L = s;
    }
    else
    {
        while (p && j < i - 1){
            j++;
            p = p->next;
        }
        if (!p)return ERROR;
        s->next = p->next;
        p->next = s;
    }
    return OK;
}

Status ListDelete(LinkList L, int i, ElemType &e){
    int j = 1;
    LinkList q, p = L;
    if (!L)return ERROR;
    else if (i == 1){
        L = p->next;
        e = p->data;
        free(p);
    }
    else
    {
        while (p->next && j < i - 1){
            j++;
            p = p->next;
        }
    }
    if (!p->next || j > i - 1){
        return  ERROR;
        q = p->next;
        p->next = q->next;
        e = q->data;
        free(q);
    }
    return OK;
}

void ListTraverse(LinkList L, void(*visit)(ElemType&)){
    LinkList p =L;
    while (p)
    {
        visit(p->data);
        p = p->next;
    }
    printf("\n");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 15:11:24

线性表带头结点的单链表的链式表示和实现的相关文章

单链表的链式存储总结

基本数据结构之-单链表的链式存储 链表是一种插和删除元素很便捷的数据结构,原因是它存储的数据在内存中不连续,可以根据需要自己动态开辟. 和数组比较起来主要的缺点就是不能随机访问,如果是单链表,那么要访问一个数据,必须从头开始遍历一次! 对于基本数据结构围绕增删查改等操作,单链表的改可以通过删和增的结合来操作.因此就不用代码来表示了! 任何一个数据结构都有它的基本的数据结构,这儿给出一种用void *代替的写法 基本的数据结构的定义: // 定义指针的结构体 typedef struct _LIN

单链表的链式存储的两种插入方式

/* 头插法建立单链表示例 */ void CreateListHead(LinkList *L, int n){ LinkList p; int i; srand(time(0)); // 初始化随机数种子 *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; for( i=0; i < n; i++ ) { p = (LinkList)malloc(sizeof(Node)); // 生成新结点 p->data = rand(

单链表的链式结构表示

from:shiyanlou 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define TRUE 1 5 #define FALSE 0 6 #define OK 1 7 #define ERROR 0 8 #define OVERFLOW -2 9 10 typedef int ElemType; 11 typedef int Status; 12 13 /* 14 * 存储结构 15 */ 16 typedef struct

带头结点的单链表操作说明

一.单链表简介 相对于以数组为代表的"顺序表"而言,单链表虽然存储密度比较低(因为数据域才是我们真正需要的,指针域只是用来索引,我们并不真正需要它),但是却具有灵活分配存储空间.方便数据元素的删除.方便元素插入等优点 单链表是线性表链式存储的一种,其储存不连续.单链表的数据结构中包含两个变量:数据和指向下一结点的指针.一个结点只知道下一个结点的地址.一个单链表必须有一个头指针,指向单链表中的第一个结点.否则链表会在内存中丢失. 一般的链表可以不带头结点,头指针直接指向第一个节点,如下图

无头结点的单链表(C语言)

1.单链表: 在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序与物理顺序是一致的.但链表却不同,链表是用一组任意的存储单元来存放 线性表的结点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上.因此,链表中结点的逻辑顺序与物理顺序不一定相同.为了正确表示节点间的逻辑关系,必须在存储线性表的每个数据元素的同时,存储指示其后继结点的地址信息,这两部分信息共同构成了单链表结点的结构,如下图: 结点包括两个域,数据域用来存放结点的值,指针域用来存

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

单链表带头结点&amp;不带头结点

转自:http://blog.csdn.net/xlf13872135090/article/details/8857632 Node *head;  //声明头结点 带头结点初始化 void InitList(Node **head){ *head=(Node *)malloc( sizeof(Node)); (*head)->next=NULL; } 带头结点尾插入,统一操作 方式一: void CreatList(Node **head){     Node *r=*head,*s;   

03.带头结点的单链表

/** * 带头结点的单链表 */ public class LinkListDemo { public static void main(String[] args){ Node n1 = new Node(1,"A"); Node n2 = new Node(2,"B"); Node n3 = new Node(3,"C"); Node n4 = new Node(4,"D"); // LinkList linkList

链表习题(4)-有一个带头结点的单链表,编写算法使其元素递增有序

1 /*有一个带头结点的单链表,编写算法使其元素递增有序*/ 2 /* 3 算法思想:利用直接插入排序的思想,先构成只含有一个数据结点的有序单链表,然后依次插入 4 剩余结点到合适的位置. 5 */ 6 void Sort(LinkList& L) 7 { 8 LNode *p = L->next, *pre; 9 LNode *r = p->next; 10 p->next = NULL; 11 while (p) 12 { 13 r = p->next; 14 pre