线性链表

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<queue>
#include<vector>
#include<algorithm>
#define N 1001000
#define INf 0X3f3f3f3f
using namespace std;
typedef long long LL;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;

typedef struct node
{
    ElemType data;
    struct node *next;
} LNode, *LinkList;
int m=sizeof(LNode);

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

void TravelList_L(LinkList L)
{
    LinkList p=L->next;

    while(p)
    {
        printf("%d ", p->data);
        p=p->next;
    }
}

void CreateList_L(LinkList &L, int n)
{
    L=(LinkList)malloc(m);
    L->next=NULL;
    for(int i=0; i<n; i++)
    {
        LinkList p=(LinkList)malloc(m);
        scanf("%d", &(p->data));
        p->next=L->next;
        L->next=p;
    }
}

Status InsertList_L(LinkList &L, int i, ElemType e)
{
    printf("请按所给思路实现单链表插入运算!\n");
    LinkList s, p=L;
    int j=0;

    while(!p&&j!=i-1)
    {
        p=p->next;
        j++;
    }

    if(!p || i<1)
        return ERROR;

    s=(LinkList)malloc(m);
    s->data=e;
    s->next=p->next;
    p->next=s;

    return OK;
}

Status DeleteList_L(LinkList &L, int i, int &e)
{
    printf("请按所给思路实现单链表删除运算!\n");
    LinkList p=L, q;
    int j=0;

    while(p&&j!=i-1)
    {
        p=p->next;
        j++;
    }
    if(!p || i<1)
        return ERROR;
    q=p->next;
    e=q->data;
    p->next=q->next;
    free(q);
    return OK;
}

int main()
{
    LinkList L1;
    int n;
    ElemType x;
    printf("请输一个整数:");
    scanf("%d", &n);
    printf("\n尾插法建单链表,请输入%d个整数:\n", n);
    CreateList_L(L1, n);
    printf("尾插法建单链表成功!,单链表中的数据是:\n");
    TravelList_L(L1);
    printf("\n");
    printf("在第一个结点位置插入元素15:\n");
    InsertList_L(L1, 1, 15);
    printf("插入后,链表中数据为:\n");    TravelList_L(L1);
    printf("\n");

    if(DeleteList_L(L1, 3, x))
    {
        printf("\n删除第三个元素成功!被删除元素是:%d\n删除后单链表中数据是\n", x);
        TravelList_L(L1);
        printf("\n");
    }
    else
        printf("\n删除元素失败\n");
    return 0;
}
时间: 2024-10-12 17:18:23

线性链表的相关文章

线性链表的双向链表——java实现

.线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素. 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null. 循环链表:一种首尾相连的链表. 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点. 下面给出线性表双向链表的实现:java中LinkedList是线性表的链式实现,是一个双向链表. import java.util.NoSuchElementE

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type

数据结构 线性链表

//线性链表头文件 #ifndef _vzhanglinklist #define _vzhanglinklist typedef struct _LinkNode{ struct _LinkNode *pnext; }LinkNode; typedef void LinkList; //创建线性链表 _declspec(dllexport) LinkList* LinkList_Create(); //销毁线性链表 _declspec(dllexport) int LinkList_Destr

从新定义线性链表及其基本操作

链表在空间的合理利用上和插入.删除时不需要移动等优点,因此在很多场合下,它是线性表的首先储存结构.然而它也存在着实现某些基本操作,如求线性表的长度时不如顺序储存结构的特点.因而从新定义线性链表及其基本操作 头文件: #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define MYOVERFLOW -2 typedef int Status; typedef int Elemty

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i

线性链表之顺序表

顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 特点:顺序存取,随机访问. /* Name: SeqList Copyright: 1.0 Author: Johnny Zen Date: 04/06/17 21:51 Description: 线性链表之顺序表 *//* Chinese:顺序(线性)表 English:SeqList*/#in

利用线性链表基本操作完成两个有序线性表的合并

La.Lb线性链表升序排列,将结果放在Lc链表里.之前有文章写过两个有序链表的合并 区别在于,前面的做法是保留La的头节点,free掉Lb的头节点,将余下节点串起来.这种方法是面向过程编程 而现在讨论的做法,是单独建立一个Lc链表,利用一些已经写好的基本操作函数来完成,这种模块化编程做法实际上还简单些.不光模块函数里写不了几行,在调用这些函数时减少了不必要的琐碎过程的思考时间. 该做法的核心思想:将每轮比较过后偏小的那个节点从相应链表中删除(这是头节点的指针不会指向该节点了,但该节点的空间依旧保

5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 广义表(扩展线性链表存储表示) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.SequenceString.c  

【C++】双向线性链表容器的实现

// 双向线性链表容器 #include <cstring> #include <iostream> #include <stdexcept> using namespace std; // 链表类模板 template<typename T> class List { public: // 构造.析构.支持深拷贝的拷贝构造和拷贝赋值 List(void) : m_head(NULL), m_tail(NULL) {} ~List(void) { clear

创建单线性链表的不同表示方法和操作

创建单线性链表,常见的有头插法.尾插法创建线性链表,常见的操作有:创建链表.查找.删除.添加元素.求逆链等操作. 这里首先用头插法创建链表: //头指针唯一确定一个单链表 #define MaxSize 15 typedef int elem_type ; typedef struct linklist { elem_type data; struct linklist *next; } Linklist; //头插入法建立链表:每次将头结点的指针赋值给新结点,然后将新节点赋值给头结点指针 Li