单链表的创建、单链表的删除、单链表的插入(数据结构)

1.创建一个超级简单的单链表

#include <stdio.h>
/*

*csdn学院

*目的:让代码见证成长(作为一个初学的菜鸟,如

*大家有发现错误,欢迎指正!)

*运行软件:CodeBlocks

*作者:小臣小仁

*完成日期:2020年3月15日

*/
struct student
{
    int num;//学号
    float score;//得分
    struct student *next;//指向下一个指针的结构体
};
int main()
{
    struct student a,b,c,*p,*head;
    //给结构体赋值
    a.num=1001;
    a.score = 86;

    b.num=1002;
    b.score = 88;

    c.num = 1003;
    c.score = 98;
    //连接链表
    head = &a;
    a.next = &b;
    b.next = &c;
    c.next = NULL;
    //输出链表
    p = head;
    do
    {
        printf("%d %.2f\n",p->num,p->score);
        p = p->next;
    }while(p != NULL);
    return 0;
}

运行结果:

2、单链表的创建(尾插法)

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

*csdn学院

*目的:让代码见证成长(作为一个初学的菜鸟,如

*大家有发现错误,欢迎指正!)

*运行软件:CodeBlocks

*作者:小臣小仁

*完成日期:2020年3月18日

*/
typedef struct NODE//创建结构体数组
{
    int data;//存放数值
    struct NODE *next;//指向下一个结点
}Node;
/*功能:遍历链表,输出保存在data里面的内容*/
void traverse(Node *Head)//遍历链表
{
    Node *p = Head;//*p指针为运动的指针,指向头结点
    while(p != NULL)
    {
        printf("%-5d",p->data);//输出*p遍历到的结点值
        p = p->next;//*p继续指向下一个结点
    }
    printf("\n");
    return;
}
/*
功能:将手动申请的空间释放释放
*/
void Free_List(Node *Head)//释放链表
{
    Node *pointer = NULL;//将替换头结点的指针先设为空
    while(Head != NULL)
    {
        pointer = Head->next;//指向链表下一个结点
        free(Head);//释放头结点
        Head = pointer;//将刚才*pointer指向的下一个节点设为头指针
    }
    return;
}
/*
用尾插法建立一个单链表
*/
void *createLinkList(int n)//创造链表
{
    //将头指针Head,尾指针Last,指向申请空间的Pointer设为空,预防程序出错时指向随机的位置
    Node *pointer = NULL,*Last = NULL,*Head = NULL;
    int i=0;
    int d;//输入的数值存放的变量
    while(i<n)
    {
        pointer = (Node *)malloc(sizeof(Node));//动态申请空间
        printf("输入存入第%d个数据值:",i+1);
        scanf("%d",&d);
        pointer->data = d;//存入数值
        pointer->next = NULL;//指向下一个结点为空
        if(Head == NULL)//当头结点为空时,将头结点指向所申请的第一个结点
            Head = pointer;//头指针指向第一个结点
        else//当不为空时链表进行链表尾插入
            Last->next = pointer;
        Last = pointer;//将尾指针指移向尾部
        i++;
    }
    return Head;
}
int main()
{
    Node *head;
    head=createLinkList(5);//创建单链表结点数为5个
    traverse(head);//遍历链表,输出存储数值
    Free_List(head);//释放链表
    return 0;
}

输出结果:

3、单链表的插入

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

*csdn学院

*目的:让代码见证成长(作为一个初学的菜鸟,如

*大家有发现错误,欢迎指正!)

*运行软件:CodeBlocks

*作者:小臣小仁

*完成日期:2020年3月15日

*/
typedef struct NODE
{
    int data;//存放数据
    struct NODE *next;//指向下一个节点
}Node;

/*功能:遍历链表,输出保存在data里面的内容*/
void traverse(Node *h)
{
    Node *p = h;//指向头指针
    while(p != NULL)
    {
        printf("%-5d",p->data);//输出data中保存的数据
        p = p->next;//p指向下一个节点的地址
    }
    printf("\n");
    return;
}
/*
功能:将待插入的数插入链表
*/
Node *insertNode(Node *h,int b)
{
    Node *p,*q1,*q2;//这里p为存放插入的数据结构体,q1为
    q1 = h;//指向头结点
    p = (Node *)malloc(sizeof(Node));//开辟空间,生成新结点
    p->data = b;//保存插入的数值b
    if(h == NULL)//如果链表为空,p作为头结点
    {
        h = p;
        h->next = NULL;//链表指向空
    }
    else if(h->data > p->data)//当插入元素小于头结点元素,p作为头结点
    {
        h = p;//头结点赋值为p
        p->next = q1;//p指向的下一个节点为原来的头结点
    }
    else
    {
        while(q1!=NULL && p->data>q1->data)//当插入元素值大于头结点,往后找到合适位置
        {
            q2 = q1;//q2记录q1的值
            q1 = q1->next;//q1指向下一个结点
        }
        p->next = q2->next;//插入操作,p指向当前p的下一个节点
        q2->next = p;//q2的下一个节点变为p
    }
    return h;
}
/*
功能:将手动申请的空间释放释放
*/
void Free_List(Node *Head)
{
    Node *pointer = NULL;
    if(Head != NULL)
    {
        pointer = Head;//指向头指针
        Head = Head->next;//头指针指向下一个节点
        free(pointer);//释放pointer指向的空间
    }
    return;
}
int main()
{
    int b[6] = {34,56,43,67,32,98};//将这组数组插入链表,呈升序
    Node *head= NULL;//创建一个头结点
    int i = 0;
    while(i<6)
    {
        head = insertNode(head,b[i]);//将这组数组呈升序插入链表,返回头指针
        i++;
    }
    traverse(head);//遍历链表
    Free_List(head);//释放链表
    return 0;
}

运行结果:

4、单链表的删除

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

*csdn学院

*目的:让代码见证成长(作为一个初学的菜鸟,如

*大家有发现错误,欢迎指正!)

*运行软件:CodeBlocks

*作者:小臣小仁

*完成日期:2020年3月15日

*/
/*结构体*/
typedef struct NODE
{
    int data;//每个结点的数据项
    struct NODE *next;//指向下一个节点
}Node;
/*遍历链表*/
void traverse(Node *Head)
{
    Node *pointer = Head;//移动指针*pointer指向头结点
    while(pointer != NULL)//*pointer不为空的情况下
    {
        printf("%-5d",pointer->data);//输出指针指向的数据项
        pointer=pointer->next;//指向链表的下一个节点
    }
    printf("\n");
    return;
}
/*释放链表*/
void Free_List(Node *Head)
{
    Node *pointer = NULL;//移动指针*pointer指向头结点
    while(Head != NULL)//当头指针不为空,循环执行
    {
        pointer = Head->next;//*pointer指向下一个节点
        free(Head);//释放头结点
        Head = pointer;//将指向下一个结点的*pointer的结点设为头结点
    }
    printf("链表已销毁\n");
    return;
}
/*插入链表*/
Node *insertNode(Node *Head,int b)
{
    Node *q1,*q2,*p;//设置*q1,*q2为可移动的替换指针,*p指向动态分配内存的指针
    q1 = Head;//指向头结点
    p = (Node *)malloc(sizeof(Node));//动态分配空间
    p->data = b;//将数组元素值赋值给指针
    if(Head == NULL)//没有头结点设为头结点
    {
        Head = p;//头结点指向*p
        p->next = NULL;//*p指向下一个结点为空
    }
    else if(Head->data > p->data)//数值比头结点数值小设为头结点
    {
        Head = p;//头结点指向*p
        p->next = q1;//*p的下一个结点指向*q1
    }
    else//数值大于头结点存储的数值
    {
        while(q1!=NULL && q1->data<=p->data)当*q1指针不为空且*q的数据值小于等于*p指向的数据值
        {
            q2=q1;//将指针*q2存*q1地址
            q1=q1->next;//q1指向链表下一个地址
        }
        p->next=q2->next;//将待插入链表指向待插入位置的下一关结点
        q2->next=p;//指针*q2下一关结点指向*p
    }
    return Head;
}
Node *deleteNode(Node *Head,int b)
{
    Node *q = NULL,*p = Head;
    if(Head == NULL)//链表为空
    {
        printf("链表为空,删除失败\n");
    }
    else//链表不为空
    {
        while(p->data != b && p->next != NULL)//循环直到查找到要删除的位置
        {
            q = p;//*q指针存放*P地址
            p = p->next;//p继续往下查找
        }
        if(p->data == b)//找到待删除位置
        {
            if(p==Head)//如果为头结点
            {
                Head = p->next;//头结点指向下一个结点
            }
            else//不是头结点
            {
                q->next = p->next;//将要删除的上一个节点直接指向待删除的下一关结点
            }
            free(p);//释放代表将删除的结点*p
        }
        else
        {
            printf("%d 没有查找到,删除失败。\n",b);
        }

    }
    return Head;
}
int main()
{
    int b[6]={23,34,55,29,78,15};//待插入的数组
    Node *Head=NULL;// 头结点指针
    int i;
    for(i=0;i<6;i++)
        Head = insertNode(Head,b[i]);//插入链表
    traverse(Head);//遍历链表
    Head = deleteNode(Head,29);//删除链表
    traverse(Head);//遍历链表
    Free_List(Head);//释放链表
    return 0;
}

输出结果:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值