C语言数据结构-单向链表

        数据结构是任何一个语言的基础,下面就讲解一下C语言的数据结构--单向链表。

        首先我们需要定义一个链表:

struct Test {
    int data;
    struct Test *next;

};

        链表就是定义一个结构体,结构体中有一个链表指针,这个链表指针指向别的链表就形成了一个链,这就是链表,链表分单向和双向,本节主要将的是单向链表。

        链表的创建:

struct Test* insertFromBehind(struct Test* head,struct Test* new)//尾插法
{
    struct Test* point;
    point = head;
    if(head == NULL)
    {
        head = new;
        return head;
    }
    while(point->next != NULL)//移动到尾巴
    {
        point = point->next;
    }
    point->next = new;//最后一个节点next指针指向新节点
    return head;
}

struct Test* insertFromhead(struct Test* head,struct Test* new)//头插法
{
    if(head == NULL)//如果链表没有节点时直接赋值
    {
        head = new;
    }else
    {
        new->next = head;//新节点的next指针指向头节点
        head = new;//头节点等于新节点
    }
    return head;
}

        上面是链表创建是头插法和尾插法,在实际应用是我们需要,进行连续的插入,因此需要再写一个函数去调用头插和尾插,实现连续插入。

struct Test* insertLinkHead(struct Test* head)
{
    struct Test* new = NULL;
    while(1)
    {
        new = (struct Test*)malloc(sizeof(struct Test));
        new->next = NULL;
        printf("please input your data:\n");
        scanf("%d"&(new->data));
        if(new->data == 0)
        {
            printf("quit\n");
            free(new);
            return head;
        }else
        {
            head = insertFromBehind(head,new);
        }
    }
}

        链表的遍历:

void printLink(struct Test* head)//链表的遍历
{
    struct Test* point = head;
    while(point != NULL)
    {
        printf("%d ",point->data);
        point = point->next;
    }
    printf("\n");
}

        链表节点数量:

 

int LinkNum(struct Test* head)//链表节点数量
{
    static int num = 0;
    struct Test* point = head;
    while(point != NULL)
    {
        num ++;
        point = point->next;
    }
    return num;
}

        改变链表节点的值:

int changLink(struct Test* head,int num)//更改链表节点
{
    struct Test* point = head;
    int chang_num;
    while(point != NULL)
    {
        if(point->data == num)
        {
            printf("please input your data:\n");
            scanf("%d",&chang_num);
            point->data = chang_num;
            return 1;
        }
        point = point->next;
    }
    return 0;
}

        检查某个节点是否存在:

int isExist(struct Test* head,int num)//查询节点是否存在
{
    struct Test* point = head;
    while(point != NULL)
    {
        if(point->data == num)
        {
            return 1;
        }
        point = point->next;
    }
    return 0;
}

        在某个节点后方插入新节点:

int insertLinkNumBehind(struct Test* head,int num,struct Test* new)//在某个节点后面插入一个新节点
{
    struct Test* point = head;
    while(point != NULL)
    {
        if(point->data == num)//找到节点
        {
            new->next = point->next;//新节点的next指针指向此节点的下一个
            point->next = new;//此节点的下一个是new
            return 1;
        }
        point = point->next;
    }
    return 0;
}

        在某个节点的前方插入新节点:

struct Test* insertLinkNumFront(struct Test* head,int num,struct Test *new)//在某个节点的前方插入新节点
{
    struct Test* point = head;
    if(head->data == num)
    {
        new->next = head;
        return new;
    }
    while(point != NULL)
    {
        if(point->next->data == num)
        {
            new->next = point->next;
            point->next = new;
            return head;
        }
        point = point->next;
    }
    return head;
}

        删除某个节点:

  

struct Test* delectNum(struct Test* head,int data)//删除某个节点
{
    struct Test* point = head;
    if(point->data == data)
    {
        head = head->next;
        return head;
    }

    while(point != NULL)
    {
        if(point->next->data == data)
        {
           point->next = point->next->next; 
           return head;
        }
        point = point->next;
    }
    return head;
}

        总代码:

#include <stdio.h>
#include <stdlib.h>
struct Test
{
    int data;
    struct Test *next;
};

struct Test* insertFromBehind(struct Test* head,struct Test* new)//尾插法
{
    struct Test* point;
    point = head;
    if(head == NULL)
    {
        head = new;
        return head;
    }
    while(point->next != NULL)//移动到尾巴
    {
        point = point->next;
    }
    point->next = new;//最后一个节点next指针指向新节点
    return head;
}
struct Test* insertFromhead(struct Test* head,struct Test* new)//头插法
{
    if(head == NULL)//如果链表没有节点时直接赋值
    {
        head = new;
    }else
    {
        new->next = head;//新节点的next指针指向头节点
        head = new;//头节点等于新节点
    }
    return head;
}

struct Test* insertLinkHead(struct Test* head)
{
    struct Test* new = NULL;
    while(1)
    {
        new = (struct Test*)malloc(sizeof(struct Test));
        new->next = NULL;
        printf("please input your data:\n");
        scanf("%d",&(new->data));
        if(new->data == 0)
        {
            printf("quit\n");
            free(new);
            return head;
        }else
        {
            head = insertFromBehind(head,new);
        }
    }
}
void printLink(struct Test* head) //链表的遍历
{
    struct Test* point = head;
    while(point != NULL)
    {
        printf("%d ",point->data);
        point = point->next;
    }
    printf("\n");
}
int LinkNum(struct Test* head)//链表节点数量
{
    static int num = 0;
    struct Test* point = head;
    while(point != NULL)
    {
        num ++;
        point = point->next;
    }
    return num;
}
int changLink(struct Test* head,int num)//更改链表节点
{
    struct Test* point = head;
    int chang_num;
    while(point != NULL)
    {
        if(point->data == num)
        {
            printf("please input your data:\n");
            scanf("%d",&chang_num);
            point->data = chang_num;
            return 1;
        }
        point = point->next;
    }
    return 0;
}

int isExist(struct Test* head,int num)//查询节点是否存在
{
    struct Test* point = head;
    while(point != NULL)
    {
        if(point->data == num)
        {
            return 1;
        }
        point = point->next;
    }
    return 0;
}

int insertLinkNumBehind(struct Test* head,int num,struct Test* new)//在某个节点后面插入一个新节点
{
    struct Test* point = head;
    while(point != NULL)
    {
        if(point->data == num)//找到节点
        {
            new->next = point->next;//新节点的next指针指向此节点的下一个
            point->next = new;//此节点的下一个是new
            return 1;
        }
        point = point->next;
    }
    return 0;
}

struct Test* insertLinkNumFront(struct Test* head,int num,struct Test *new)//在某个节点的前方插入新节点
{
    struct Test* point = head;
    if(head->data == num)
    {
        new->next = head;
        return new;
    }
    while(point != NULL)
    {
        if(point->next->data == num)
        {
            new->next = point->next;
            point->next = new;
            return head;
        }
        point = point->next;
    }
    return head;
}

struct Test* delectNum(struct Test* head,int data)//删除某个节点
{
    struct Test* point = head;
    if(point->data == data)
    {
        head = head->next;
        return head;
    }

    while(point != NULL)
    {
        if(point->next->data == data)
        {
           point->next = point->next->next; 
           return head;
        }
        point = point->next;
    }
    return head;
}
int main()
{
    int num = 0;
    int isOK = 0;
    struct Test* head = NULL;
    struct Test new1 = {20,NULL};
    struct Test new2 = {30,NULL};

    head = insertLinkHead(head);
    printLink(head);
    num = LinkNum(head);
    printf("LinkNumber = %d\r\n",num);
    changLink(head,2);
    printLink(head);
    isOK = isExist(head,2);
    if(isOK == 1)printf("number is exist\n");
    else printf("number is not exist\n");

    insertLinkNumBehind(head,100,&new1);
    printLink(head);

    head = insertLinkNumFront(head,1,&new2);
    printLink(head);
    head = delectNum(head,3);
    printLink(head);
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值