动态链式表示与实现

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MYOVERFLOW -2
typedef int Status;
typedef int Elemtype;//用指定标识符Elemtype代表int类型,顾名思义表示元素类型为int型
typedef struct LNode{
    Elemtype data;
    LNode *next;
}*LinkList;
Status visit(LinkList L);//对链表进行遍历的函数
void assignment(LinkList &L);//为链表附上初始值
Status GetElem_L(LinkList L, int i, Elemtype &e);
//L为带头结点的单链表的头指针
//当第i个元素存在是,其值赋给e并返回OK,否则返回ERROR
void ListTraverse(LinkList L, Status(*pf)(LinkList L));//依次对L的每个元素调用函数,一旦函数失败,则操作失败
Status ListInsert_L(LinkList &L, int i, Elemtype e);//在带头结点的单链线性表L中第i个位置之前插入元素e
Status ListDelete_L(LinkList &L, int i, Elemtype &e);//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc);
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
Status visit(LinkList L)//对链表进行遍历的函数
{
    if (L == NULL){
        cout << "it is an empty list!" << endl;//L是空链表,遍历失败
        return ERROR;
    }
    LinkList p;
    p = L;
    p = p->next;
    for (; p != NULL; p=p->next)//输出p->data知道p为NULL,此时链表已被遍历完全
        cout << p->data << " ";
    cout << endl;
    return OK;
}
void assignment(LinkList &L)//为链表附上初始值
{
    cout << "please input the length of the linklist:";
    int n;
    cin >> n;//输入链表的节点个数,不包括一个空的头结点
    cout << endl;
    cout << "please input the data of the LNode:";
    LNode *p;
    p = new LNode;
    p->data = NULL;//头结点的数据元素为NULL
    L = p;
    for (int i = 1; i <= n; i++){
        p->next = new LNode;//建立新的节点
        p = p->next;        //指针后移
        cin >> p->data;     //输入节点的数据元素
    }
    p->next = NULL;         //最后一个节点指针域为空指针
    cout << "the linklist‘s assignment is completed!" << endl;
}void ListTraverse(LinkList L, Status(*pf)(LinkList L))//依次对L的每个元素调用函数,一旦函数失败,则操作失败
{
    visit(L);
}
Status GetElem_L(LinkList L, int i, Elemtype &e)
//L为带头结点的单链表的头指针
//当第i个元素存在是,其值赋给e并返回OK,否则返回ERROR
{
    if (i < 1){
        cout << "the number of " << i << " you have input is wrong!" << endl;//位置<1则说明输入数据错误
        return ERROR;
    }
    LinkList p;
    p = L;
    for (int j = 1; j <= i&&p!=NULL; j++){//将p移动到第i个结点(不包括头结点)
        p = p->next;
    }
    if (p == NULL){                       //如果移动到最后一个结点还未到达第i个结点,则说明输入数据错误,超过了链表长度
        cout << "can‘t find the position of i in the linklist!" << endl;
        return ERROR;
    }
    e = p->data;//将i位的数据元素赋值给e
    return OK;
}
Status ListInsert_L(LinkList &L, int i, Elemtype e)//在带头结点的单链线性表L中第i个位置之前插入元素e
{
    LinkList p;
    p = L;
    int j = 1;
    if (i >= 1){
    for (; j < i&&p; j++, p = p->next){}//找到i位的前一个结点
    if (p){
        LinkList temp = new LNode;
        temp->data = e;
        temp->next = p->next;//修改指针,使新建的结点插入到链表中
        p->next = temp;
        return OK;
    }
    else {           //如果到达最后一个结点还没到达i的前一个结点,则说明输入数据错误
        cout << "the position " << i << " you have input is wrong!" << endl;
        return ERROR;
    }
    }
    else {
        cout << "the position " << i << " you have input is wrong!" << endl;
        return ERROR;
    }
}
Status ListDelete_L(LinkList &L, int i, Elemtype &e)//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
{
    LinkList p;
    p = L;
    int j = 1;
    if (i >= 1){
        for (; j <i&&p->next; j++, p = p->next){}//找到i位的前一个结点
        if (p->next){
            LinkList temp;
            temp = p->next;
            e = temp->data;
            p->next=p->next->next;//修改指针,使新建的结点插入到链表中
            delete temp;
            return OK;
        }
        else {           //如果到达最后一个结点还没到达i的前一个结点,则说明输入数据错误
            cout << "the position " << i << " you have input is wrong!" << endl;
            return ERROR;
        }
    }
    else {
        cout << "the position " << i << " you have input is wrong!" << endl;
        return ERROR;
    }
}
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
//已知单链线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
{
    LinkList pa, pb, pc;
    pa = La->next;
    pb = Lb->next;
    pc = Lc;
    for (; pa&&pb;){
        if (pa->data < pb->data){
            pc->next = pa;
            pa = pa->next;
            pc = pc->next;
        }
        else{
            pc->next = pb;
            pb = pb->next;
            pc = pc->next;
        }
    }
    if (pa)
        pc -> next = pa;
    else pc->next = pb;
}
时间: 2024-08-02 10:55:35

动态链式表示与实现的相关文章

链式生产环境装配

链式生产环节装配: /// <summary> /// 数据,它会反复接收工厂里各个环节的加工 /// </summary> public class DataStream { public string Status { get; set; } } /// <summary> /// 节点抽象类,模拟各种机器 /// </summary> /// <typeparam name="T"></typeparam>

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

用php实现一个简单的链式操作

最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen(trim($str)); 那么能否实现下面这种写法呢? $str->trim()->strlen(); 下面就来试下. 链式操作,说白了其实就是链式的调用对象的方法.既然要实现字符串的链式操作,那么就要实现一个字符串类,然后对这个类的对象进行调用操作.我对字符串类的期望如下:(1)当我创建对象时,

线性表的链式表示和实现--单链表

单链表分为:动态链表.静态链表两种. 单链表的定义 链式存储:用一组任意存储单元存储线性表的数据元素. 逻辑顺序与物理顺序可以相同也可以不相同 插入.删除方便,共享空间好. 单链表的节点结构 每个结点有一个元素和下个元素的地址(只有一个连接域),称单链表. 链表有表头.表尾,表头也就是首地址,表尾为空值. 链表是非顺序存储,顺序存取. p1.x = p→x  (p1为对象,p为首地址) class ListNode{ int  data; ListNode *next; }; ListNode

线性表的Java实现--链式存储(单向链表)

线性表的Java实现--链式存储(单向链表) 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始. 链式存储结构的线性表将采用一组任意的存储单元存放线性表中的数据元素.由于不需要按顺序存储,链表在插入.删除数据元素时比顺序存储要快,但是在查找一个节点时则要比顺序存储要慢. 使用链式存储可以克服顺序线性表需要预先知道数据大小的缺点,链表结构可以充分利用内存空间,实现灵活的内存动态管理.但是链式存储失去了数组随机存取的特点,同时增加了节点的指针域,空

数据结构之第二章线性表之静态链式存储

1--特点:用一维数组来描述线性表,用游标代替指针指示节点在数组中的相对位置.不设“指针”类型的高级语言中适用链表结构. 2--线性表的静态链式存储结构 ////  静态单链表.h//  单链表的静态存储//// 6 //  Copyright (c) 2014年 dashuai. All rights reserved.// #ifndef SLIST_H#define SLIST_H#include <stdio.h>#include <stdlib.h> #define MA

04.线性表(三)链式存储结构.单链表2

链式存储结构.单链表2 顺序存储结构的创建实质是一个数组的初始化,存储空间连续且其大小和类型已经固定:单链表存储空间不连续,是一种动态结构且它所占用空间的大小和位置是不需要预先分配划定的,可以根据系统的情况和实际的需求即时生成. 一.单链表的整表创建 创建单链表的过程就是一个动态生成链表的过程,即从"空表"的初始化起,依次建立各元素结点,并逐个插入链表. 1.算法思路 (1)声明一个结点p和计数器变量i; (2)初始化一空链表L (3)让链表L的头结点的指针指向NULL,即建立一个带头

05.线性表(四)链式存储结构.静态链表

链式存储结构.静态链表   一.静态链表 1.静态链表存储结构 单链表是通过指针实现的,但是我们也可以通过数组来代替指针描述单链表,即静态链表.如何实现静态链表?构造数组的元素由两个数据域组成:data和cur,即数组的每个下标都对应一个data和一个cur. 数据域data:用来存放数据元素,即要处理的数据: 游标cur:存放该元素的后继在数组中的下标,相当于单链表中的next指针: 为了方便插入数据,我们通常会把数组建立得大一些,以便有一些空闲空间而不致于出现溢出情况. 线性表的静态链表存储

单链表的链式存储总结

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