zhuzhu1、结构框图:
2、增删改查:
定义链表节点和对象类型
/*************************************************************************
	> File Name: link.h
	> Author: yas
	> Mail: rage_yas@hotmail.com
	> Created Time: Tue 03 Sep 2024 11:30:03 AM CST
 ************************************************************************/
#ifndef _LINK_H
#define _LINK_H
typedef int DataType;
//链表的节点类型
typedef struct node
{
    DataType data;     //数据域
    struct node *pnext;//指针域
}Link_Node_t;
//链表的对象类型
typedef struct link
{
    Link_Node_t *phead;//头结点
    int clen;          //当前节点个数
}Link_t;
extern Link_t *create_link();
extern int push_link_head(Link_t *plink,DataType data);
extern void print_link(Link_t *plink);
extern int push_link_tial(Link_t *plink,DataType data);
int pop_head(Link_t *plink);
int pop_tail(Link_t *plink);
int clear_link(Link_t *plink);
int update_link_data(Link_t *plink,DataType old_data,DataType new_data);
int *find_link_data(Link_t *plink,DataType data);
#endif程序
/*************************************************************************
> File Name: link.c
> Author: yas
> Mail: rage_yas@hotmail.com
> Created Time: Tue 03 Sep 2024 11:29:54 AM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include"link.h"
//创建一个链表对象
Link_t *create_link()
{
    //在堆上开辟sizeof(link_t)大小的空间
    Link_t *plink = malloc(sizeof(Link_t));  
    if(NULL == plink)//判断创建成功
    {
        perror("fail malloc");
        return NULL;
    }
    plink->phead = NULL;//初始化头指针
    plink->clen = 0;    //初始化当前链表长度
    return plink;       //返回创建好的链表对象
}
//头插
int push_link_head(Link_t *plink,DataType data)
{
    //堆上开空间
    Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->data = data;  //初始化节点->数据域
    pnode->pnext = NULL; //初始化节点->指针域
    pnode->pnext = plink->phead; //头插
    plink->phead = pnode;        //头结点指向新节点
    plink->clen++; 
    return 0;
}
//遍历
void print_link(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    while(p != NULL)
    {
        printf("%d\n",p->data);
        p = p->pnext;
    }
}
//判空
int is_empty_link(Link_t *plink)
{
    return plink->phead == NULL;
}
//尾插
int push_link_tial(Link_t *plink,DataType data)
{
    Link_Node_t *pnode = malloc(sizeof(Link_Node_t));
    if(NULL == pnode)
    {
        perror("fail malloc");
        return -1;
    }
    pnode->data = data;
    pnode->pnext = NULL;
    if(is_empty_link(plink))
    {
        plink->phead = pnode;
    }
    else
    {
        Link_Node_t *p = plink->phead;
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        p->pnext = pnode;
    }
    plink->clen++;
    return 0;
}
//头删
int pop_head(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        return 0;
    }
    else
    {
        plink->phead = p->pnext;
    }
    plink->clen--;
    free(p);
}
//尾删
int pop_tail(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        return 0;
    }
    else if(plink->clen == 1)
    {
        pop_head(plink);
    }
    else
    {
        Link_Node_t *p = plink->phead;
        while(p->pnext->pnext != NULL)
        {
            p = p->pnext;
        }
        free(p->pnext);
        p->pnext = NULL;
        plink->clen--;
    }
    return 0;
}
//清空链表
int clear_link(Link_t *plink)
{
    Link_Node_t *p = plink->phead;
    while(!(is_empty_link(plink)))
    {
        pop_head(plink);
    }
}
//修改数据
int update_link_data(Link_t *plink,DataType old_data,DataType new_data)
{
    Link_Node_t *p = plink->phead;
    if(is_empty_link(plink))
    {
        printf("link is empty\n");
        return 0;
    }
    else
    {
        while(p->data != old_data)
        {
            p = p->pnext;
        }
        p->data = new_data;
    }
}
//查找数据
int *find_link_data(Link_t *plink, DataType data)
{
    Link_Node_t *p = plink->phead;
    while (p != NULL)  
    {
        if (p->data == data)  
        {
            printf("%p\n", p);  
        }
        p = p->pnext;  
    }
    return NULL;  
}
int main()
{
    
    Link_t *plink = create_link();
    if(NULL == plink)
    {
        return -1;
    }
    push_link_head(plink,4);
    push_link_head(plink,3);
    push_link_head(plink,2);
    push_link_head(plink,1);
    //clear_link(plink);
    push_link_tial(plink,5);
    push_link_tial(plink,6);
    push_link_tial(plink,7);
    push_link_tial(plink,8);
    //pop_head(plink);
    //pop_tail(plink);
    //print_link(plink);
    update_link_data(plink,7,9);
   // find_link_data(plink,5);
    print_link(plink);
    return 0;
}


















