单链表(增删改查)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define DataType int
struct node
{
    DataType data;
    struct node* next;
};
typedef struct node* pnode;
void head_insert(pnode*,DataType);//头插法
void rear_insert(pnode*,pnode*,DataType);//尾插法
void show_list(pnode);//遍历链表
void delete(pnode*,DataType,DataType*);//删除元素
DataType* find(pnode,DataType);//查找元素
void mod(pnode,int,DataType);//修改值为key的元素
bool mod1(pnode,DataType,DataType);//修改第n个元素
void destory();//注销列表
void main()
{
    pnode head=NULL;
    pnode rear=NULL;

    rear_insert(&head,&rear,1);
    rear_insert(&head,&rear,2);
    rear_insert(&head,&rear,3);
    rear_insert(&head,&rear,4);
    show_list(head);

    DataType m;
    delete(&head,3,&m);
    show_list(head);

}
void head_insert(pnode* top,DataType data)
{
    pnode newnode=(pnode)malloc(sizeof(struct node));//申请空间
    if(NULL==newnode)
            return;
    newnode->data=data;//插入元素

    newnode->next=*top;//改变指向
    *top=newnode;
}
void rear_insert(pnode* top,pnode* last,DataType data)
{
    pnode newnode=(pnode)malloc(sizeof(struct node));//申请空间
    if(NULL==newnode)
            return;
    newnode->data=data;

    if(NULL==*top)
        *top=newnode;
    else
        (*last)->next=newnode;//注意优先级
    *last=newnode;
}
void show_list(pnode top)
{
    while(NULL!=top)
    {
        printf("%d ",top->data);
        top=top->next;
    }
    putchar(10);//换行
}
DataType* find(pnode top,DataType key)
{
    while(NULL!=top && top->data!=key)
            top=top->next;
    if(NULL==top)
    {
        printf("未找到\n");
        return NULL;
    }
    else
    {
        printf("找到了\n");
        return &(top->data);
    }
}
bool mod1(pnode top,DataType key,DataType data)
{
    DataType* tmp=find(top,key);
    if(NULL==tmp)
            return false;
    else
            *tmp=data;
    return true;
}
void mod(pnode top,int pos,DataType data)
{
    int i=1;
    while(i!=pos)
    {
        i++;
        top=top->next;
    }
    top->data=data;
}
void delete(pnode *top,DataType key,DataType* data)
{
    pnode front,ploc;//找前驱节点
    front=NULL;
    ploc=*top;
    while(NULL!=ploc && key!=ploc->data)
    {
            front=ploc;
            ploc=ploc->next;//你追我赶
    }
    if(NULL==ploc)//下标超出
    {
        printf("没有找到要修改的元素\n");
            return;
    }
    else if(ploc==*top)//删除的是头结点
    {
            *top=(*top)->next;
    }
    else//找到元素
    {
            front->next=ploc->next;
    }
    free(ploc);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值