【 数据结构(C语言)】线性表——单链表

1.线性链表:用任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的也可以是不连续)

#include <bits/stdc++.h>
using namespace std;
#define ElemType  int
#define Status int
#define ERROR -1
#define OK 1

typedef struct LNode
{
   ElemType data;
   struct  LNode *next;
}LNode ,*LinkList;
LinkList CreateListHead_L(int n)///* 头插入
{
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    while (n--)
    {
        LinkList newnode = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&newnode->data);
        newnode->next = L->next;
        L->next = newnode;
    }
    return L;
}
LinkList CreateListTail_L(int n)///尾插入
{
    LinkList L = (LinkList)malloc(sizeof(LNode));
    LinkList last = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    last = L;
    while (n--)
    {
        ElemType e;
        scanf("%d",&e);
        LinkList newnode = (LinkList)malloc(sizeof(LNode));
        newnode->data = e;
        last->next = newnode;
        newnode->next = NULL;
        last = newnode;
    }
    return L;
}
Status GetElem_L(LinkList &L,int i,ElemType &e)
{
    LinkList index = L->next;
    int ct = 1;
    while (index && ct < i)
    {
        index = index->next;
        ++ct;
    }
    if (!index || ct > i) return ERROR;
    e = index->data;
    return OK;
}
Status ListInsert_L(LinkList &L,int i,ElemType e)
{
    LinkList index = L->next;
    int ct = 1;
    while (index && ct < (i-1))
    {
        index = index->next;
        ++ct;
    }
    if (!index || ct > i -1) return ERROR;
    LinkList newnode = (LinkList)malloc(sizeof(LNode));
    newnode->data = e;
    newnode->next = index->next;
    index->next = newnode;
    return OK;
}
Status ListDeteleByPos_L(LinkList &L,int i,ElemType &e)
{
    LinkList index = L->next;
    int ct = 1;
    while (index && ct < i-1)
    {
        index = index->next;
        ++ct;
    }
    if (!(index->next) || ct > i-1) return ERROR;
    LinkList tmp  = index->next;
    index->next = tmp->next;
    e = tmp->data;
    free(tmp);
    return OK;
}
Status ListDeteleByVal_L(LinkList &L,ElemType e)
{
    LinkList index = L->next,pri = L;
    while (index) /// 注意:判断的如果是 pri pri 是最后一个元素的时候 index 已经超出链表
    {
        if (index->data == e)
        {
            pri->next = index->next;
            free(index);
            index = pri->next;
        }
        else
        {
            pri = pri->next;
            index = index->next;
        }
    }
    return OK;
}
int GetLength(LinkList &L)
{
    int len = 0;
    LinkList index = L->next;
    while (index)
    {
       index = index->next;
       len++;
    }
    return len;
}
LinkList ListReverse(LinkList &L)
{
    LinkList a = L->next;
    LinkList b = a->next;
    LinkList c = b->next;
    a->next = NULL;
    int len = GetLength(L);
    while (len--)
    {
        b->next  = a;
        c = b;
        b = a;
        if(!a)
        {
            L->next=a;
        }
        else c=c->next;
    }
    return L;
}
void TrverseLinklist(LinkList &L)///* 注意:这里是带头指针的链表
{
    LinkList  index = L->next;
    for (;index!= NULL; index = index->next)
    {
        cout<<index->data<<" ";
    }
    cout<<endl;
}

  

时间: 2024-08-02 07:35:21

【 数据结构(C语言)】线性表——单链表的相关文章

数据结构之 线性表---单链表的拆分

数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory limit: 65536K 题目描述 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. 输入 第一行输入整数N;: 第二行依次输入N个整数. 输出 第一行分别输出偶数链表与奇数链表的元素个数: 第二行依次输出偶数子链表的所有数据: 第三行依次输出奇数子链表的所有数据. 示例输入 10 1 3 22

数据结构之 线性表---单链表操作A (删除链表中的指定元素)

数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除.分别输出建立的初始单链表和完成删除后的单链表. 输入 第一行输入数据个数n: 第二行依次输入n个整数: 第三行输入欲删除数据m. 输出 第一行输出原始单链表的长度: 第二行依次输出原始单链表的数据: 第三行输出完成删除后的单链表长度: 第四行依次输出完成删除后的

数据结构之 线性表---单链表的操作B(先逆序+再删除重复元素)

数据结构上机测试2-2:单链表操作B Time Limit: 1000MS Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个). 输入 第一行输入元素个数n: 第二行输入n个整数. 输出 第一行输出初始链表元素个数: 第二行输出按照逆位序所建立的初始链表: 第三行输出删除重复元素后的单链表元素个数: 第四行输出删除重复元素后的单链表. 示例输入 10 21 30 14 55 32 63

数据结构 线性表—单链表

本文只要实现单链表的初始化.插入(尾插.头插.任意位置插入).删除(尾删.头删.删除指定元素).查找等. 定义单链表 typedef int DataType; typedef struct LinkNode {  DataType data;  struct LinkNode *next; }LinkNode, *pLinkNode, *pList; 实现单链表的所有接口: void InitLinkList(pList* pHead);//单链表的初始化 void Destroy(pList

数据结构(一)线性表单链表试题

题目 快速找到未知长度的单链表的中间节点 解决思路 (一)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值 算法复杂度:O(L)+O(L/2) = O(3L/2) (二)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间 算法复杂度:O(L/2) 方法二:代码实现 //快速查找中间元素 int FindMidEle(LinkList L, Elemtype *e) { LinkList search, middle; //

Python线性表——单链表

1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继. 数据结构中常见的线性结构有数组.单链表.双链表.循环链表等.线性表中的元素为某种相同的抽象数据类型.可以是C语言的内置类型或结构体,也可以是C++自定义类型. 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界.C语言中定义一个数组: 数组下标是从0开始的

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

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

数据结构 --- 02. 内存, 顺序表, 单链表

一.内存 1.基本概念 计算机的作用: 就是用来存储和运算二进制的数据 变量的概念: 就是计算机中的某一块内存空间   衡量计算机内存大小的范围: bit byte kb mb 计算机中内存空间都会有两个基本的属性 大小 地址 不同数据占用内存空间的大小 整数:4byte float:4byte double:8byte 字符:1byte 理解a=10的内存图(引用,指向) 指向:如果一个变量存储了某一块内存空间的地址,则表示该变量指向该块内存 引用:如果一个变量存储了某一块内存空间的地址,则该

线性表—单链表

.1.链式存储结构实现 单链表和双链表(这边讲单链表). 2.基础概念 a.结点:结点由数据域和地址域(链)两部分组成.而结点整体在效果上可以看作是该结点的地址(指针).这个地址域一般是后继元素的地址(即下一个结点的总体).所以最后一个元素的地址域为^,其表示空,即没有后续元素.b.单链表:每个结点只有一个地址域的线性链表称为单链表.c.双链表:每个结点有两个地址域的线性表链称为双链表,两个地址域分别指向前驱元素和后继元素. 3.单链表的实现 线性表接口LList: package com.cl