单向链表的基本操作(创建,插入,删除,销毁,输出)(c语言)

线性链表的基本操作:基础知识:熟练掌握动态数组,结构体,指针

(单向链表的创建)

基本思想:首先创建一个头节点,让头指针和尾指针指向刚创建的空间;

然后动态建立一个空间,用pnew指向这个空间,tail指向的指针域(即结构体内存放地址的地方)存放pnew指向的空间的地址;

最后,将pnew赋值给tail;循环这个过程

如图,代码如下

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

struct student
{
    int score;
    struct student* next;
};

typedef struct student student;

student* Creatlist()
{
    student* head, * tail, * pnew;
    int score;
    head = (student*)malloc(sizeof(student));
    if (head == NULL)
    {
        printf("the memory is no enough\n");
        return NULL;
    }
    head->next = NULL;
    tail = head;
    printf("input the score:\n");
    while (1)
    {
        scanf("%d", &score);
        if (score < 0)
            break;
        pnew = (student*)malloc(sizeof(student));
        if (pnew == NULL)
        {
            printf("the memory is no enough\n");
            return NULL;
        }
        pnew->score = score;
        pnew->next = NULL;

        tail->next = pnew;
        tail = pnew;
    }
    return (head);
}



int main()
{
    student* p = Creatlist();

    return 0;
}

(单向链表的插入操作)

基本思想:通过单链表的头指针head,找到链表的第一个节点(即将head指向的地址赋给pnew);然后,通过遍历单向查找第i个节点,pnew指向第i个节点之后;插入后将新节点的指针域指向第i个节点的后继结点,再将第i个节点的指针域指向新的节点;

如此,插入的节点平滑的与链表连接了起来

struct NODE
{
    int score;
    struct student* next;
};
typedef struct NODE NODE;


void Insert_Linklist(NODE* head,NODE* pnew,int i)
{
    NODE* p;
    int j;
    
    p = head;
    for (j = 0; j < i && p != NULL; j++)
        p = p->next;
    if (p == NULL)
    {
        printf("the %d node not found\n");
        return;
    }
    pnew->next = p->next;
    p->next = pnew;
}

(单向链表的删除)

基本思想:查找操作都一直,设置两个指针p,q;

for操作后p指向第i个节点的前驱节点;

q指向第i个节点;删除时执行p->next=q->next即可,最后释放第i个节点的空间;

void Delete_Linklist(NODE* head, int i)
{
    NODE* p, * q;
    int j;
    if (i == 0)
        return;

    p = head;
    for (j = 1; j < i && p->next != NULL; j++)
        p = p->next;
    if (p->next == NULL)
    {
        printf("the %d node not found\n", i);
        return;
    }

    q = p->next;
    p->next = q->next;
    free(q);
}

(单链表的销毁)(操作与每次删除一个节点相同)

即将创建的链表从内存中释放;

基本思想:每次删除头节点的后继结点,最后删除头节点。

同时每次都用free()释放内存。

不要以为删除了头节点就是删除了整个链表,这其实只是无法访问这个链表,但仍然还会占用大量空间。

void free_Linklist(NODE* head)
{
    NODE* p, * q;
    p = head;
    while (p->next != NULL)
    {
        q = p->next;
        p->next = q->next;
        free(q);
    }
    free(head);
}

(链表的输出)

基本思想:通过单链表的头指针head,让指针p指向下个节点访问操作,然后输出其数据值,一直循环,直到访问到尾节点NULL停止

void Display_Linklist(NODE* head)
{
    NODE* p;

    for (p = head->next; p != NULL; p = p->next)
        printf("%d ", p->score);
    printf("\n");
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢.598

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值