链表学习(链表的创建,插入,删除,查找,遍历)

链表学习

1.链表的创建:
创建一个 头结点 并返回 空的节点

Linked* Create()
{
    Linked* head = (Linked*)malloc(sizeof(Linked));
    head -> next = NULL;
    return head;   
}

2.链表的删除:

删除标志节点后的下一个节点

void DeleteAfter(Linked* node)
{
    Linked* nextnode=node->next; 
	node -> next = nextnode -> next;
	free(nextnode);//释放删除节点的内存
}

3.查找节点

查找链表中索引为 index 的元素,注意当 index 为 0 的时候返回的是头节点的下一个节点;

Linked* GetByIndex(Linked *head,int index)
{
    head=head->next;

    if(index==0)
    {
        return head;
    }
    else
    {
        while(index--)
        {
            head=head->next;
        }
        return head;//查找索引节点
    }	
    
}

4.插入节点

在指定节点后面插入一个新节点,并赋值;

void InsertAfter(Linked* node,int num,float sc)
{
    Linked* newNode = (Linked*)malloc(sizeof(Linked));
    newNode->key=num;
    newNode->num=sc;
    newNode->next=node->next;
    node->next=newNode;
}

5.遍历节点

逐个遍历:

void PrintAll(Linked* head)
{
   
    Linked* p=head->next;

    while(p)//当 p = NULL 的时候结束 
    {
        cout << p->key<<" "<<p->num<<endl;
        p=p->next;
    }
    
}

主程序:

#include <iostream>
using namespace std;


struct Linked
{
    /********* Begin *********/
    //结构体的成员变量
    int  key;
    float num;
    Linked* next;

    /********* End *********/
};

Linked* Create()
{
    /********* Begin *********/
    //创建并返回一个新链表

    Linked* head = (Linked*)malloc(sizeof(Linked));
    head -> next = NULL;
    return head;
    
    
    /********* End *********/
}

void InsertAfter(Linked* node,int num,float sc)
{
    /********* Begin *********/
    //在指定节点后插入一个新节点,内容由 num,sc 参数指定
    Linked* newNode = (Linked*)malloc(sizeof(Linked));
    newNode->key=num;
    newNode->num=sc;
    newNode->next=node->next;
    node->next=newNode;
    /********* End *********/
}

void DeleteAfter(Linked* node)
{
	/********* Begin *********/
    //删除此节点之后的一个节点
    
    Linked* nextnode=node->next; 
	node -> next = nextnode -> next;
	free(nextnode);
	  
	/********* End *********/
}

Linked* GetByIndex(Linked *head,int index)
{
	/********* Begin *********/
    //返回指定索引处的节点
    head=head->next;

    if(index==0)
    {
        return head;
    }
    else
    {
        while(index--)
        {
            head=head->next;
        }
        return head;
    }
	/********* End *********/	
    
}

void PrintAll(Linked* head)
{
   
    Linked* p=head->next;

    while(p)//当 p = NULL 的时候结束 
    {
        cout << p->key<<" "<<p->num<<endl;
        p=p->next;
    }
    
}

int main()
{
	int num;
	float score;
	cin >> num >> score ;
    Linked* lk = Create();//创建头节点 
    InsertAfter(lk,num,score);//插入第一组数据 
    
	cin >> num >> score ;
    InsertAfter(GetByIndex(lk,0),num,score);//找到第一个节点,在第一个节点后插入节点 
    
	cin >> num >> score ;
    InsertAfter(GetByIndex(lk,1),num,score);//找到第二个节点,在第一个节点后插入节点 
    
    DeleteAfter(GetByIndex(lk,0));//删除第二个节点 
    PrintAll(lk);//打印 
}

结果图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

QiWen.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值