2024-02-05 单向、双向链表 work

1. 单向链表新增、删除

typedef int datatype;
//创建节点结构体
typedef struct Node
{
	//数据域:存储数据元素
	datatype data;
	//指针域:存储下一个节点的地址
	struct Node *next;
}*Linklist;

/*
 * function:    创建一个节点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回节点的地址,失败返回NULL
 */
Linklist create_node()
{
    Linklist s=(Linklist)malloc(sizeof(struct Node));
    if(NULL==s)
        return NULL;
    //成功
    //s节点的数据域清0
    s->data=0;
    //s节点的指针域指向NULL
    s->next=NULL;
    return s;
}

/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 插入的值  头指针
 * @return      返回头指针
 */
Linklist insert_rear(datatype element,Linklist head)
{
//创建新节点s
    Linklist s=create_node();
    if(NULL==s)
        return head;
       s->data=element;

//1,判断链表为空
    if(NULL ==head)
    {
        head=s;
    }
    else //链表不为空
    {
        //1,循环到最后一个节点
        Linklist p=head;
        while(p->next!=NULL)
        {
            p=p->next;
        }
        //2,在p后面插入s
        p->next=s;
    }
    return head;

}

/*
 * function:    尾删
 * @param [ in] 
 * @param [out] 头指针
 * @return      返回头指针
 */
Linklist delete_rear(Linklist head)
{
    //1,判断链表为空
    if(NULL ==head)
        return head;
    //2,判断链表只有一个节点
    if(NULL ==head->next)
    {
        free(head);head=NULL;
    }
    else //存在多个节点>=2
    {
        //3.找到倒数第2个节点
        Linklist del=head;
        while(del->next->next!=NULL)
        {
            del=del->next;
        }
        //4.删除del->next
        free(del->next);
        del->next=NULL;
    }
    return head;
}

2. 双向链表新增、删除

typedef char datatype[30];//datatype-->char [30]
//定义结构体
typedef struct Node
{
	//数据域:存储数据元素
	datatype data;
	//指针域:存储下一个节点的地址
	struct Node *next;
	//指针域:存储上一个节点的地址
	struct Node *priv;
}*Doublelink;

/*
 * function:    创建节点
 * @param [ in] 
 * @param [out] 
 * @return      成功返回首地址 失败返回NULL
 */
Doublelink create_node()
{
    Doublelink s=(Doublelink)malloc(sizeof(struct Node));
    if(NULL==s)
        return NULL;
    //成功
    strcpy(s->data,"");
    s->next=s->priv=NULL;
    return s;
}

/*
 * function:    双向链表头插
 * @param [ in] 
 * @param [out] 值,头指针
 * @return      返回头指针
 */
Doublelink double_insert_head(datatype element,Doublelink head)
{
    //创建新节点s
    Doublelink s=create_node();
    if(s==NULL)
        return head;
    strcpy(s->data,element);

    //1.判断链表为空
    if(NULL ==head)
        head=s;
    //2.存在多个节点>=1
    else
    {
        s->next=head;
        head->priv=s;
        head=s;
    }
    return head;

}

/*
 * function:    头删
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Doublelink delete_head(Doublelink head)
{
    //1,判断链表为空
    if(NULL==head)
        return head;
    //2,存在多个节点
    Doublelink q=head;
    head=head->next;
    if(head!=NULL)
        head->priv=NULL;
    free(q);
    q=NULL;
    return head;
}

你可能感兴趣的:(链表,数据结构)