纯c实现单链表的增删改查

  • 纯c实现单链表的增删改查

1.里面包含头插法和尾插法,分别对应逆序输出和顺序输出
(文中先将头插法注释化,采用尾插法顺序输出)

#include <stdio.h>
#include <stdlib.h>

typedef struct tagListNode{
    int data;
    struct tagListNode* next;
}ListNode, *List;

//函数声明
void PrintList(List head);
List headinsert (List head);
List rearinsert(List head);
List insert (List head); //增
List delete (List head);   //删
List change (List head);  //改
List search (List head);  //查

//主函数
int main()
{
    //分配链表头结点
    ListNode *head;
    head = (ListNode*)malloc(sizeof(ListNode));
    head->next = NULL;
    
    // printf("现在是!!逆序插入\n");
    // printf("你想输入多少个数?回车后分别输入你要输入的数:\n");
    // headinsert(head);
    // printf("输出为:\n");
    // PrintList(head); 
    
    
    printf("现在是!!顺序插入\n");
    printf("你想输入多少个数?回车后分别输入你要输入的数:\n");
    rearinsert(head);
    printf("此时链表为:\n");
    PrintList(head);           
    
    //元素插入
    insert(head);
    printf("此时链表为:\n");
    PrintList(head);
    
    //删除元素
    delete(head);
    printf("此时链表为:\n");
    PrintList(head);

    //元素修改
    change(head);
    printf("此时链表为:\n");
    PrintList(head);

    //元素查找
    search(head);

    return 0;
}
//头插法
List headinsert (List head)
{
    int n ;
    List a, b;//指针a和b
    a = head;
    
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        b = (ListNode *)malloc(sizeof(ListNode));
        scanf("%d", &b->data);
        b->next=a->next; //此时b->next指向了NULL; 因为a->next = head->next
        a->next=b; //
    }
    return head;
}
//尾插法
List rearinsert(List head)
{
    int n;
    List a,b; //指针a和b;
    a = head;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
    {
        b = (ListNode *)malloc(sizeof(ListNode));
        scanf("%d", &b->data);
        b->next = a->next;
        a->next = b;
        a=b;
    }
    return head;
}

//插入元素
List insert (List head)
{
    int location_a, elem_b ,j;
    List p,b;
    j=0;
    p=head;
    printf("请输入你要插入的位置和元素值:\n");
    scanf("%d%d", &location_a, &elem_b);
    
    while ( p!= NULL && j<location_a-1)
    {
        p = p->next;
        j++;
    }//此时p指针已经移动要要插元素的上一个元素位置了
    if( p==NULL)
    {
        printf("插入位置不合法:\n");
        return head;
    }
    b = (ListNode *)malloc(sizeof(ListNode));
    b->data = elem_b;
    b->next = p->next;
    p->next = b;
    return head;
}

//删除元素
List delete(List head)
{
    
    printf("请输入你要删除的元素的位置:\n");
    int delete_a;
    scanf("%d", &delete_a);
    int j=0;
    List p,q;
    p = head;
    while (p!=NULL && j<delete_a-1)
    {
        p = p->next;
        j++;
    }
    if(p == NULL)
    {
        printf("删除位置不合法\n");
        return head;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return head;
}

//修改元素
List change(List head)
{
    printf("输入你想修改的元素位置和修改后的元素值:\n");
    int location,elem;
    scanf("%d%d", &location ,&elem);
    int j=0;
    List p,q;
    p = head;
    while (p!=NULL && j<location-1)
    {
        p = p->next;
        j++;
    }
    if(p == NULL)
    {
        printf("修改的位置不合法\n");
        return head;
    }
    p->next->data = elem;

    return head;
}

//查找元素
List search(List head)
{
    printf("输入你想查找的元素的值:\n");
    int elem,n=0;
    scanf("%d", &elem);
    List p,q;
    p = head;
    while (p!=NULL && p->data!=elem)
    {
        p = p->next;
        n++;
    }
    printf("该元素的位置为:%d\n",n);
    if(p==NULL)
    {
        printf("找不到该元素哦~\n");
    }

    return head;
}

//打印链表
void PrintList(List head)
{
    ListNode* p = head->next;// 跳过头节点,p直接指向第一个数据元素

    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值