单链表

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

typedef int DATATYPE;

typedef struct node 
{
    DATATYPE data;
    struct node *next;
}linklist;

linklist *create_empty_linklist()
{
    linklist *head;

    head = (linklist *)malloc(sizeof(linklist));

    head->next = NULL;//当前创建出来的节点后续没有其他节点

    return head;
}

int insert_data_by_head(linklist *head,DATATYPE data)
{
    linklist *temp;

    temp = (linklist *)malloc(sizeof(linklist));
    temp->data = data;

//  错误演示
//  head->next = temp;
//  temp->next = NULL;

    temp->next = head->next;
    head->next = temp;

    return 0;
}

int insert_data_by_tail(linklist *head,DATATYPE data)
{
    linklist *p = head;
    linklist *temp;

    while(p->next != NULL)
        p = p->next;

    temp = (linklist *)malloc(sizeof(linklist));
    temp->data = data;

    p->next = temp;
    temp->next = NULL;

    return 0;
}

int print_data(linklist *head)
{
    linklist *p = head->next;//跳过头节点、头节点中没有数据

    while(p != NULL)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

linklist *find_assign_data(linklist *head,DATATYPE data)
{
    linklist *p = head->next;

    while(p != NULL)
    {
        if(p->data != data)
            p = p->next;
        else 
            return p;
    }
}

linklist *find_data_by_num(linklist *head,int num)
{
    linklist *p = head;
    int i = 1;
    if(num == 0)
        return head;

    while(p->next != NULL)
    {
        if(i <= num)
        {
            p = p->next;
            i ++;
        }
        else 
            return p;
    }

}

int insert_data_anywhere(linklist *head,int post,DATATYPE data)
{
    linklist *p;
    linklist *temp;

    p = find_data_by_num(head,post - 1);//目的是寻找post对应节点的前一个节点地址

    temp = (linklist *)malloc(sizeof(linklist));
    temp->data = data;

    temp->next = p->next;
    p->next = temp;

    return 0;
}

int delete_assign_post_data(linklist *head,int post)
{
    //要删除一个元素,必须先获取它的前面节点的地址
    linklist *p;

    p = find_data_by_num(head,post - 1);

    linklist *temp;

    if(p != NULL && p->next != NULL)
    {
        temp = p->next;
        p->next = temp->next;

        free(temp);
        temp = NULL;
    }

    return 0;
}

void cleanup_linklist(linklist *head)
{
    linklist *p = head;
    linklist *temp;

    while(p)
    {
        temp = p;
        free(temp);
        temp = NULL;

        p = p->next;
    }
}

int main(int argc, const char *argv[])
{
    linklist *head;

    head = create_empty_linklist();

    int i;
    int data;
    for(i = 0;i < 5;i ++)
    {
        scanf("%d",&data);
//      insert_data_by_head(head,data);//头插法
        insert_data_by_tail(head,data);//尾插法
    }

//  printf("%d\n",head->next->data);
//  printf("%d\n",head->next->next->data);

    print_data(head);

    linklist *p;
    //查找元素值为4的节点首地址
    p = find_assign_data(head,4);
    printf("%d\n",p->data);

    //查找链表中第四个节点,头算第0个
    p = find_data_by_num(head,4);
    printf("%d\n",p->data);

    //如何事先按照任意位置插入元素
    insert_data_anywhere(head,3,100);//在第三个位置插入元素100
    print_data(head);

    //删除指定位置元素
    delete_assign_post_data(head,3);//删除第三个位置的元素    
    print_data(head);

//  cleanup_linklist(head);
//  print_data(head);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值