单向链表——C++红书第七章课后习题~周末作业

📕的课后习题

创建链表

一般创建链表我们先使用typedef struct,这样定义结构体变量时,我们就可以直接可以用link *head;,定义结构体类型变量了。

//声明节点结构
typedef struct Link{
	int elem;
	struct Link *next; //指向后继元素的指针
	}link;
链表creat函数
link *creat()
{
	link *head = new link; //创建一个头节点
    link *t= head; /*声明一个指针指向头节点,用于遍历链表*/
    //生成链表
    for(int i=1;i<=n;i++)
    {//创建节点并初始化
        link *a=new link ;
        cin>>a->elem;
        a->next=NULL;
        //建立新节点与直接前驱节点的逻辑关系
        t->next=a;
        t=t->next;
    }
    return head;
}
链表print函数
void print(link *head)
{
    link *t=head; //将t指针指向头结点
    //只要t指针指向的结点的next不是NULL,就执行输出语句
    while (t->next)
    {
        t=t->next;
        cout<<t->elem<<" ";
    }
    cout<<endl;
}
链表del函数
//n是要删除元素所在位置的值
link *del(link * head,int n)
{
    link *t=head;
    for(int i=1;i<n;i++)
    {
        t=t->next;
    }
    link *delnum=t->next; //单独设置一个指针指向被删除结点,以防丢失
    t->next=t->next->next;//删除某个结点的方法就是更改前一个结点的指针域
    delete delnum; //手动释放该结点,防止内存泄漏
    return head;
}
链表insert函数
//elem表示新数据元素,n表示新元素要插入的位置
link *insert(link*head,int elem,int n)
{
    link *t=head; //创建临时结点t
    //首先要找到要插入位置的上一个结点
    for(int i=1;i<n;i++)
    {
        if(t==NULL)
        {
            cout<<"error";
            return head;
        }
        t=t->next;
    }
    //创建插入结点c
    link *c=new link;
    c->elem=elem;
    //向链表中插入结点
    c->next=t->next; //这里有一定的顺序,详解看下面两张图
    t->next=c;
    return head;
}

在这里插入图片描述
在这里插入图片描述

蒟蒻的代码
#include<iostream>
using namespace std;
typedef struct Link
{
    int elem ;
    struct Link *next;
}link;
int n;
link *creat();  //创建一个链表
link *insert(link*head,int elem,int n); //插入元素
link * del (link*head, int n); //删除元素
void print(link*head);  //输出结点的值
int main()
{
    cin>>n;
    link* p=creat();
    cout<<"创建的链表是\n";
    print(p);

    p=del(p,3);
    cout<<"删除一个元素后的链表是\n";
    print(p);

    p=insert(p,5,4);
    cout<<"增加一个元素后的链表是\n";
    print(p);
}
link *creat()
{
    link *head = new link;
    link *t= head;
    for(int i=1;i<=n;i++)
    {
        link *a=new link ;
        cin>>a->elem;
        a->next=NULL;
        t->next=a;
        t=t->next;
    }
    return head;
}
void print(link *head)
{
    link *t=head;
    while (t->next)
    {
        t=t->next;
        cout<<t->elem<<" ";
    }
    cout<<endl;
}
link *del(link*head,int n)
{
    link *t=head;
    for(int i=1;i<n;i++)
    {
        t=t->next;
    }
    link *delnum=t->next;
    t->next=t->next->next;
    delete delnum;
    return head;
}
link *insert(link*head,int elem,int n)
{
    link *t=head;
    for(int i=1;i<n;i++)
    {
        if(t==NULL)
        {
            cout<<"error";
            return head;
        }
        t=t->next;
    }
    link *c=new link;
    c->elem=elem;
    c->next=t->next;
    t->next=c;
    return head;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值