单链表基本函数

这篇博客详细介绍了单链表的一些基本操作,包括如何初始化链表、判断链表是否为空、使用头插法和尾插法创建链表、按序号和值查找节点、计算链表长度、在任意位置插入和删除节点,以及销毁链表。这些操作是数据结构中链表基础知识的重要组成部分。
摘要由CSDN通过智能技术生成


void InitList(LinkList* PHead)
{
    if ((*PHead = (LinkList)malloc(sizeof(Node))) == NULL)
    {
        printf("内存申请失败!\n");
        return;
    }
    (*PHead)->Next = NULL;
}

//判断单链表是否为空

int ListEmpty(LinkList PHead)
{
    return  PHead->Next == NULL;
}

//头插法建表
void CreatFormHead(LinkList PHead)
{
    DataType data;
    Node* s;             //要插入的结点指针
    scanf("%d", &data);
    while (data != -1)    //输入要插入的值以-1作为结束标志
    {
        s = (Node*)malloc(sizeof(Node));
        s->Data = data;
        s->Next = PHead->Next;
        PHead->Next = s;
        scanf("%d", &data);
    }
}

//尾插法建表
void CreatFormTail(LinkList PHead)
{
    Node* s;
    Node* tail;
    DataType data;
    tail = PHead;
    scanf("%d", &data);
    while (data != -1)
    {
        s = (Node*)malloc(sizeof(Node));
        s->Data = data;
        s->Next = tail->Next;
        tail->Next = s;
        tail = s;   //tail始终指向表尾
        scanf("%d", &data);
    }
}

//按序号查找

Node* Get(LinkList PHead, int i)
{
    Node* p;   //结点指针
    int j = 0;
    p = PHead;
    if (ListEmpty(PHead))    //空表
    {
        printf("表为空!\n");
        return 0;
    }
    while (!ListEmpty(PHead) && j < i)
    {
        p = p->Next;
        j++;
    }
    if (j == i)
    {
        return p;   /*返回指向第i个结点的指针p*/
    }
    return NULL;
}


//按值查找
int Locate(LinkList PHead, DataType data)
{
    Node*p = PHead->Next;
    int i = 1;
    while (p)
    {
        while (p->Data != data)
        {
            p = p->Next;
            i++;
        }
        break;              //找到节点时退出循环
    }
    return i;
}

//求单链表的长度
int length(LinkList PHead)
{
    Node *p;
    p = PHead;
    int len = 0;
    while (p->Next != NULL)
    {
        len++;
        p = p->Next;
    }
    return len;
}

//任意位置插入
void InsList(LinkList PHead, int i, DataType data)
{
    Node*p;
    Node*s;
    p = PHead;
    int j = 0;
    while (p->Next != NULL && j < i - 1)
    {
        p = p->Next;
        j++;
    }
    if (p == NULL)
    {
        return; //插入位置不合法
    }
    s = (Node*)malloc(sizeof(Node));  //新建一个结点
    s->Data = data;
    s->Next = p->Next;
    p->Next = s;
}

//任意位置删除
int DelList(LinkList PHead, int i, DataType* data)
{
    Node* p;
    Node* s;
    p = PHead;
    int k = 0;
    /*删除位置i小于0,或者删除位置大于元素个数,
    比如链表中只有一个元素,i=2时*/
    if (i < 0 || i>length(PHead))
    {
        printf("删除位置不合法!\n");
        return 0;  //删除位置不合法
    }
    while (p->Next != NULL && k < i - 1)
    {
        p = p->Next;
        k++;
    }
    s = p->Next;
    *data = s->Data;
    p->Next = s->Next;
    free(s);
    return *data;
}


//销毁链表
void DestoryList(LinkList PHead)
{
    Node* p;
    Node* q;
    p = PHead;
    while (p->Next != NULL)
    {
        q = p;
        p = p->Next;
        free(q);
    }
}


//打印表中元素
void PrintList(LinkList PHead)
{
    Node* p;
    p = PHead->Next;
    while (p)
    {
        printf("%d ", p->Data);
        p = p->Next;
    }
    printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值