1、数据结构-单链表的实现-C语言

typedef struct LNode
{
    int data;
    struct LNode* next;
} LNode,*LinkList;    //这两者等价。LinkList这样方便理解

void Show_Help();
//初始化线性表
void InitList(LinkList *L);
//销毁线性表
void DestroyList(LinkList *L);
//清空线性表
void ClearList(LinkList *L);
//线性表是否为空
int ListEmpty(LinkList *L);
//线性表长度
int ListLength(LinkList *L);
//线性表查找
void GetElem(LinkList L,int i);
//返回相同元素的位置
void LocateElem(LinkList L,int e);
//求前驱
void PriorElem(LinkList L,int previous);
//求后继
void NextElem(LinkList L,int next);
//插入元素
void ListInsert(LinkList *L,int key,int value);
//删除元素
void ListDelete(LinkList *L,int key);
//显示线性表中元素
void TraverList(LinkList L);
//线性表翻转

//--------------------------------------------------------------------

void Show_Help()
{
    printf("1---初始化单链表\n");
    printf("2---销毁单链表\n");
    printf("3---置空单链表\n");
    printf("4---判断单链表是否为空\n");
    printf("5---求单链表长度\n");
    printf("6---获取单链表某位置元素\n");
    printf("7---请输入元素的值,判断其在单链表中是否存在,并返回其下标,不存在则返回0\n");
    printf("8---求直接前驱\n");
    printf("9---求直接后继\n");
    printf("10---插入元素\n");
    printf("11---删除元素\n");
    printf("12---显示单链表全部元素\n");
    printf("13---翻转单链表全部元素\n");
    printf("14---演示单链表的并操作\n");
    printf("退出,输入一个负数\n");
}

void InitList(LinkList *L)
{
    *L = (LNode*) malloc(sizeof(LNode));  //生成头结点,并用L指针指向头结点
    if(!(*L)){
        printf("分配失败\n");
        return ;
    }
    (*L)->next = NULL;
}

void DestroyList(LinkList *L)
{
    //销毁时要从头到尾都删除
    LinkList cut;
    while(*L){
        cut = *L;
        *L = (*L)->next;
        free(cut);
    }
}

void ClearList(LinkList *L)
{
    //把除了头结点的其他全删除
    LinkList cut=(*L)->next;
    LinkList middle;
    while(cut){
        middle = cut->next;
        free(cut);
        cut = middle;
    }
}

int ListEmpty(LinkList *L)
{
    if((*L)->next == NULL)
        return 1;
    else
        return 0;
}

int ListLength(LinkList *L)
{
    int num = 0;
    LNode* middle = (*L);
    while(middle->next){
        num++;
        middle = middle->next;
    }
    return num;
}

void GetElem(LinkList L,int i)
{
    LinkList middle = L->next;
    int key = 1;
    int value;
    while(middle && key<i){
        middle = middle->next;
        key++;
    }
    if(key>i || middle==NULL){
        printf("输入范围有误,请重新选择。\n");
        return;
    }
    value = middle->data;
    printf("位于第%d个位置的值为:%d\n",i,value);
}

void LocateElem(LinkList L,int value)
{
    LinkList middle = L->next;
    int key = 0;
    int num = 1;
    while(middle){
        middle = middle->next;
        num++;
        if(middle->data == value){
            key = num;
            break;
        }

    }
    if(key)
        printf("%d在单链表中下标为%d\n",value,key);
    else
        printf("%d在单链表中不存在\n",value);
}

void PriorElem(LinkList L,int previous)
{
    if(previous == 1){
        printf("第一个元素没有前驱,请重新选择。\n");
        return;
    }
    LinkList middle = L->next;
    int num = 1;
    int value;
    while(num<(previous-1) && middle){
        num++;
        middle = middle->next;
    }
    if(middle==NULL || num>(previous-1)){
        printf("输入范围有误,请重新选择。\n");
        return;
    }
    value = middle->data;
    printf("第%d个位置的前驱为:%d\n",previous,value);
}

void NextElem(LinkList L,int next)
{
    LinkList middle = L->next;
    int num = 1;
    int value;
    while(num<(next+1) && middle){
        num++;
        middle = middle->next;
    }
    if(middle==NULL || num>(next+1)){
        printf("输入范围有误,请重新选择。\n");
        return;
    }
    if(num == next){
        printf("最后一个元素没有后继,请重新选择。\n");
        return;
    }
    value = middle->data;
    printf("第%d个位置的后继为:%d\n",next,value);
}

void ListInsert(LinkList *L,int key,int value)
{
    LinkList middle = (*L);
    int num = 0;
    while(num<key-1 && middle){
        num++;
        middle = middle->next;
    }
    if(middle==NULL || num>key-1){
        printf("输入范围有误,请重新选择。\n");
        return;
    }

    LinkList insert;
    insert = (LNode*) malloc(sizeof(LNode));    //给要插入的结点分配空间
    insert->next = middle->next;
    insert->data = value;
    middle->next = insert;

}

void ListDelete(LinkList *L,int key)
{
    LinkList cut = (*L)->next;
    int num = 1;
    while(num<key && cut){
        num++;
        cut = cut->next;
    }
    if(!cut || num>=key){
        printf("输入范围有误,请重新选择。\n");
        return;
    }
    LinkList middle = cut->next;
    cut->next = middle->next;
    free(middle);
}

void TraverList(LinkList L)
{
    printf("单链表所有元素有:");
    int num = 1;
    LinkList value = L->next;
    while(value){
        printf("%d   ",value->data);
        value = value->next;
    }
    printf("\n");
}

void Filp(LinkList* L)
{
    LinkList q = (*L)->next;
    LinkList p = q->next;
    while(p){
        q->next = p->next;
        p->next = (*L)->next;
        (*L)->next = p;
        p = q->next;
    }
    printf("翻转成功\n");
}

C语言数据结构-单链表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作的更多相关文章

  1. C/C++语言实现单链表(带头结点)

    彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按 ...

  2. C语言实现单链表-03版

    在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4, ...

  3. C语言实现单链表-02版

    我们在C语言实现单链表-01版中实现的链表非常简单: 但是它对于理解单链表是非常有帮助的,至少我就是这样认为的: 简单的不能再简单的东西没那么实用,所以我们接下来要大规模的修改啦: Problem 1 ...

  4. 数据结构 单链表&顺序表

    顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...

  5. python实现数据结构单链表

    #python实现数据结构单链表 # -*- coding: utf-8 -*- class Node(object): """节点""" ...

  6. C语言实现单链表,并完成链表常用API函数

    C语言实现单链表,并完成链表常用API函数: 1.链表增.删.改.查. 2.打印链表.反转打印.打印环形链表. 3.链表排序.链表冒泡排序.链表快速排序. 4.求链表节点个数(普通方法.递归方法). ...

  7. GO语言数据结构之链表

    链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个部分: ...

  8. C语言实现单链表节点的删除(带头结点)

    我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https: ...

  9. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

随机推荐

  1. bash姿势-没有管道符执行结果相同于管道符

    听起来比较别口: 直接看代码: shell如下: [root@sevck_linux ~]# </etc/passwd grep root root:x:::root:/root:/bin/ba ...

  2. SUSE 开启ssh、telnet

    SSH 1. /etc/ssh/sshd_config [SSH的配置文件] 2. SuSEfirewall2 stop #关闭防火墙 如图,输入命令 vi /etc/ssh/sshd_config ...

  3. Compare and Swap(CAS)

    CAS(Compare and Swap)是个原子操作.拿到一个新值后,CAS将其与内存中的值进行比较,若内存中的值和这个值不一样,则将这个值写入内存,否则,不做操作.在Java的 java.util ...

  4. oracle 启动停止过程

    oracle 主要由两部分组成:instance和database .instance是指一组后台进程/线程和一块共享内存区域,而database是指存储在磁盘上的一组物理文件. 数据库启动包括三个步 ...

  5. java判断一个字符串中是否包含全角

    public static boolean isAngle(String str){ if(str.getBytes().length==str.length()){ //全是半角 return tr ...

  6. 工作的时候用到spring返回xml view查到此文章亲测可用

    spring mvc就是好,特别是rest风格的话,一个 org.springframework.web.servlet.view.ContentNegotiatingViewResolver就可以根 ...

  7. JAVA基础知识总结9(特殊类)

    1.Object: 所有类的直接或者间接父类,Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能. 具体 ...

  8. PHP同时连接多个数据库

    PHP同时连接多个mysql数据库的具体实现 方法一: <?php $conn1 = mysql_connect("127.0.0.1", "root", ...

  9. 算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-001分析步骤

    For many programs, developing a mathematical model of running timereduces to the following steps:■De ...

  10. Linux 性能调优

    一.简介 有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等.为了更好的优化程序性能,我们必须找到性能瓶颈点,"好钢用在刀刃上"才能取得好的效果,否则可能白做工 ...