0
点赞
收藏
分享

微信扫一扫

C语言数据结构单链表操作(带头结点)

星巢文化 2022-03-11 阅读 65

#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>

typedef int ElemType;

typedef struct LNode

{                       //定义单链表节点类型

    ElemType data;      //每个结点存放下一个数据元素

    struct LNode *next; //指针指向下一个结点

} LNode, *LinkList;

/*

bool InitList(LinkList L)

{ //初始化一个单链表(带头结点)

    L = (LNode *)malloc(sizeof(LNode));

    if (L == NULL)

        return false;

    L->next = NULL;

    return true;

}

*/

//头插法建立单链表(逆向建立单链表)

LinkList List_HeadInsert(LinkList L)

{

    LNode *s;

    int x;

    L = (LinkList)malloc(sizeof(LNode));

    L->next = NULL;

    scanf("&d", &x);

    while (x != 666)

    {

        s = (LNode *)malloc(sizeof(LNode));

        s->data = x;

        s->next = L->next;

        L->next = s;

        scanf("%d", &x);

    }

}


 

/*尾插法建立单链表(正向建立单链表)

LinkList List_TailInsert(LinkList L)

{

    int x;

    L = (LinkList)malloc(sizeof(LNode));

    LNode *s, *r = L; // r为表尾指针

    scanf("%d", &x);  //输入结点值

    while (x != 666)

    {

        s = (LNode *)malloc(sizeof(LNode));

        s->data = x;

        r->next = s;

        r = s; // r指向新的表尾结点

        scanf("%d", &x);

    }

    r->next = NULL; //尾结点指针置空

    return L;

}

*/

bool Empty(LinkList L) //判断单链表是否为空

{

    if (L->next == NULL)

        return true;

    else

        return false;

}

//按值查找表结点

LNode *LocateElem(LinkList L, ElemType e)

{

    LNode *p = L->next;

    while (p != NULL && p->data != e) //从第一个结点开始查找data域为e的结点

        p = p->next;

    return p; //找到后返回该结点的指针,否则返回NULL

}

//按位查找

LNode *GetElem(LinkList L, int i)

{

    int j = 0;

    if (i < 0)

        return NULL;

    else

    {

        LNode *p; //指针p指向当前扫描到的结点

        p = L;    // L指向头结点,头结点是第0个结点

        while (p != NULL && j < i)//循环找到第i个结点

        {  

            p = p->next;

            j++;

        }

        return p;

    }

   

}

//第i个位置插入元素e

bool ListInsert(LinkList L, int i, ElemType e)

{

    if (i < 1)

        return 1; //插入位置不合法

    LNode *p;     //指针指向当前扫描到的结点

    int j = 0;    //计数器,记录当前扫描到的是第几个结点

    p = L;        //指向头结点,头结点就是第0个结点

    while (p != NULL && j < i - 1)

    { //循环找到第i-1个结点

        p = p->next;

        j++;

    }

    if (p == NULL)

        return false;

    LNode *s = (LNode *)malloc(sizeof(LNode));

    s->data = e;

    p->next = s->next;

    p->next = s; //将结点S连接到p之后

    return true; //插入成功

}

//删除单链表上的第i个结点

bool ListDelete(LinkList L, int i, ElemType e)

{

    int j = 0;

    LNode *p, *q;

    p = L;

    while (p->next && j < i - 1)

    { //循环找到第i-1个结点

        p = p->next;

        j++;

    }

    if (!(p->next) || j > i - 1) //前者表明p指针已经指向最后结点;后者表明要删除头结点

        return false;

    q = p->next;

    p->next = q->next;

    e = q->data;

    free(q);

    return true;

}

//求单链表的长度

int Length(LinkList L){

    int len = 0;//统计表长

    LNode *p = L;

    while(p->next != NULL){

        p = p->next;

        len++;

    }

    return len;

}


 

举报

相关推荐

0 条评论