单链表的建立和删除、新增、打印结点——C语言实现

单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

结构体

C语言允许用户自己建立由不同类型数据组成的组合型数据结构,他们称为结构体

动态建立链表

建立动态链表是指在程序执行过程中,从无到有建立起一个链表,即一个一个地开辟结点和输入各节点的数据,并建立起前后相连的链式关系

实现代码

#include <stdio.h>
#include <stdlib.h>
struct Student
{
    long num;
    float score;
    struct Student *next;
};
int n;
int main()
{
    struct Student *create_link();
    void print_link(struct Student *head);
    void delete_link(struct Student *head);
    void insert_link(struct Student *head);
    struct Student *st;
    st=create_link();
    print_link(st);
    delete_link(st);
    insert_link(st);
    return 0;
}
//创建单链表的函数
struct Student *create_link()
{
    struct Student *head;
    struct Student *p1,*p2;
    n=0;
    p1=p2=(struct Student*)malloc(sizeof(struct Student));
    printf("请输入第一个学生的信息:\n");
    scanf("%ld %f",&p1->num,&p1->score);
    head=NULL;
    //输入学号为0时结束
    while(p1->num!=0)
    {
        n=n+1;
        if(n==1)
            head=p1;
        else
            p2->next=p1;
        p2=p1;
        p1=(struct Student*)malloc(sizeof(struct Student));
        printf("请输入学生的信息:\n");
        scanf("%ld %f",&p1->num,&p1->score);
    }
        p2->next=NULL;
        return head;
};
//删除节点
void delete_link(struct Student *head)
{
    struct Student *pre,*p;
    void print_link(struct Student *head);
    long deleteNum;
    printf("请输入要删除的学生编号\n");
    scanf("%ld", &deleteNum);
    //要删除的节点是第一个节点
    if(head->num==deleteNum)
        head=head->next;
    else
    {
        pre=head;
        p=head->next;
        while(p!=NULL)
        {
            if(p->num==deleteNum)
            {
                if(p->next==NULL)
                {
                    //要删除的节点是最后一个结点
                    pre->next=NULL;
                }
                else
                {
                    pre->next=p->next;
                }
                break;
            }
            pre=p;
            p=p->next;
        }
    }
    printf("经过删除操作后,");
    print_link(head);
}
//新增结点
void insert_link(struct Student *head)
{
    struct Student *p,*q;
    void print_link(struct Student *head);
    q=(struct Student*)malloc(sizeof(struct Student));
    printf("请输入要加入的学生信息");
    scanf("%ld %f",&q->num,&q->score);
    q->next=NULL;
    for(p=head;p->next!=NULL;p=p->next)
    {
        ;
    }
    p->next=q;
    print_link(head);
}
//输出单链表
void print_link(struct Student *head)
{
    struct Student *p;
    printf("当前的学生数据为:\n");
    p=head;
    if(head!=NULL)
    {
        do
        {
            printf("%ld %5.1f\n",p->num,p->score);
            p=p->next;
        }while(p!=NULL);
    }
}


注:为使代码更清晰易懂,上述代码未做健壮性维护。

运行结果

在这里插入图片描述

参考文献

《C程序设计(第五版)》 谭浩强编著

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值