数据结构C语言实现之单链表

#include <stdio.h>
#include <stdlib.h>
//定义函数结果状态码
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

//定义数据类型
typedef int ElemType ;
//定义程序返回状态类型
typedef int State;
//线性表的单链表存储结构
struct Node
{
    ElemType data;
    struct Node *next;
};
typedef struct Node *LinkList;

//单链表的数据操作


/*************************************************
Function:       CreateList
Description:    创建一个带头结点的空链表
Input:
Output:
Return:         成功返回头指针,失败
Others:
*************************************************/
LinkList CreateList()
{
    LinkList head;
    head = malloc(sizeof(struct Node));
    if(head == NULL)
    {
       printf("Apply HeadNode Failed");
       return NULL;

    }
    //指针域为空
    head->next = NULL;
    return head;

}


/*************************************************
Function:       EmptyList
Description:    判断单链表是否为空
Input:          必须存在的头指针 head
Output:
Return:         空返回TRUE,否则返回FALSE
Others:
*************************************************/
State EmptyList(LinkList head)
{
    if(head->next == NULL)
        return TRUE;
    else
        return FALSE;

}


/*************************************************
Function:       ClearList
Description:    将单链表置为空表
Input:          必须存在的头指针 head
Output:
Return:         成功返回OK
Others:
*************************************************/
State ClearList(LinkList head)
{
    LinkList p,q;
    //p指向第1个数据节点
    p = head->next;

    //第n轮循环先验证第n个结点存在,进入循环后,q保存第n+1个结点,释放第n个结点
    //p最终指向第n+1个数据节点
    while(p != NULL)
    {
        q = p->next;
        free(p);
        p = q;
    }
    head->next = NULL;
    return OK;
}


/*************************************************
Function:       GetLength
Description:    计算单链表数据元素,不包括头结点
Input:          必须存在的头指针 head
Output:
Return:         数据元素个数 num 大于等于0
Others:
*************************************************/
int GetLength(LinkList head)
{
    int num = 0;
    //指向第1个数据结点
    LinkList p = head->next;
    //第n轮循环先验证第n个结点是否存在,进入循环中,num++后为n,p指向第n+1个数据节点
    while(p != NULL)
    {
        num++;
        p = p->next;
    }
    return num;
}


/*************************************************
Function:       GetNode
Description:    查找第index个(不算头结点)结点的指针
Input:          必须存在的头指针 head
                位序 index 有效范围 1~length
Output:
Return:         成功返回结点指针,失败返回NULL
Others:
*************************************************/
LinkList GetNode(LinkList head, int index)
{
    //判断是不是空链表
    if(head->next == NULL)
    {
        printf("The linklist is empty");
        return NULL;
    }
    //index < 1
    if(index < 1)
    {
        printf("Index Out of Bounds");
        return NULL;
    }

    //指向第1个结点
    LinkList p = head->next;
    //结点计数器
    int i = 1;


    //第n轮循环首先验证n<index,第index结点是否为空,进入循环后,i++后会为n+1,p会指向第n+1个数据结点,
    //i=index退出,p指向第index个结点
    //p=NULL退出,越界
    while((i < index) && (p != NULL))
    {
        i++;
        p = p->next;
    }
    //验证是否越界
    //若i=index退出,不知第index结点是否存在
    //若p=NULL退出,必越界
    if(p == NULL)
    {
        printf("Index Out of Bounds");
        return NULL;
    }
    return p;
}


/*************************************************
Function:       LocateNode
Description:    查找单链表第一个为值e的数据结点位序(不算头结点)
Input:          必须存在的头指针 head
                数据元素值 e
Output:
Return:         成功返回位序(1 ~ length),未找到返回-1
Others:
*************************************************/
int LocateNode(LinkList head, ElemType e)
{
    //判断是不是空链表
    if(head->next == NULL)
    {
        printf("The linklist is empty");
        return -1;
    }

    //指向第1个数据结点
    LinkList p = head->next;
    //结点计数器
    int i = 1;

    //第n轮循环首先验证第n数据结点存在,存在进入循环中,
    //匹配返回n,否则i++后会为n+1,p会指向第n+1数据结点,

    while(p != NULL)
    {
        if(p->data == e)
            return i;
        p = p->next;
        i++;
    }
    //不存在数据为e的结点
    return -1;

}



/*************************************************
Function:       InsertNode
Description:    在单链表的index位置处(不算头结点)处插入元素值为e的结点,即插入后e元素结点处在第index的位置
Input:          必须存在的头指针 head
                插入元素位置 index 有效范围 0~length+1
Output:
Return:         成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNode(LinkList head, int index, ElemType e)
{
    //插入位置
    if(index < 1)
    {
        printf("Index Out of Bounds");
        return ERROR;
    }

    //单链表位置计数器
    int i = 1;

    LinkList p, s;
    //p指向头结点
    p = head;


    //第n轮循环开始先验证第n个结点是否 < index,第n-1个结点是否为空,进入循环中,i++后会为n+1,p会指向第n数据结点
    //i=index退出时,p保存第index-1个结点
    //p=NULL退出时,必定越界
    while((i < index) && (p != NULL))
    {
        p = p->next;
        i++;
    }
    //判断是否越界
    //i=index退出,不确定第index-1及index结点是否为空
    //p = NULL必定越界
    if((p == NULL) || (p->next == NULL))
    {
        printf("Index Out of Bounds");
        return ERROR;
    }

    s = malloc(sizeof(struct Node));
    //申请结点失败
    if(s == NULL)
    {
        printf("Apply Node Failed");
        return ERROR;
    }

    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;

}

/*************************************************
Function:       DeleteNode
Description:    删除单链表的index位置处(不算头结点)结点
Input:          必须存在的头指针 head
                删除结点位置 index 有效范围 1~length
Output:
Return:         成功返回OK,失败返回ERROR
Others:
*************************************************/
State DeleteNode(LinkList head,int index)
{
    //判断是不是空链表
    if(head->next == NULL)
    {
        printf("The linklist is empty");
        return ERROR;
    }
    if(index < 1)
    {
        printf("Index Out of Bounds");
        return ERROR;
    }
    //p指向头结点
    LinkList p = head,s;
    //结点计数器,提前指向第一个结点
    int i = 1;

    //第n轮循环开始先验证第n个结点是否 < index,第n-1个结点是否为空,进入循环中,i++后会为n+1,p会指向第n数据结点
    //i=index退出时,p保存第index-1个结点
    //p=NULL退出时,必定越界

    while((i < index) && (p != NULL))
    {
        p = p->next;
        i++;

    }
    //判断是否越界
    //i=index退出,不确定第index-1及index结点是否为空
    //p = NULL必定越界
    if((p == NULL) || (p->next == NULL))
    {
        printf("Index Out of Bounds");
        return ERROR;
    }

    s = p->next;
    p->next = s->next;
    free(s);
    return OK;
}

/*************************************************
Function:       InsertNodeHead
Description:    采用头插法插入1元素
Input:          必须存在的头指针 head
                数据元素 e
Output:
Return:         成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNodeHead(LinkList head, ElemType e)
{
    //申请结点
    LinkList s = malloc(sizeof(struct Node));
    if(s == NULL)
    {
        printf("Apply Node Failed");
        return ERROR;
    }
    s->data = e;
    //头插
    s->next = head->next;
    head->next = s;
    return OK;
}

/*************************************************
Function:       InsertNodeTail
Description:    采用尾插法插入1元素
Input:          必须存在的头指针 head
                数据元素 e
Output:
Return:         成功返回OK,失败返回ERROR
Others:
*************************************************/
State InsertNodeTail(LinkList head, ElemType e)
{

    LinkList s,p;
    //申请结点
    s = malloc(sizeof(struct Node));
    if(s == NULL)
    {
        printf("Apply Node Failed");
        return ERROR;
    }
    s->data = e;

    //p指向头结点
    p = head;
    //第n轮循环首先验证din个结点是否存在,存在进入循环,p指向dinge结点
    //循环退出p保存尾结点
    while(p->next != NULL)
    {
        p = p->next;
    }
    //尾插
    s->next = NULL;
    p->next = s;
    return OK;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值