单链表的创建

单链表的创建(一)

尾插法

#include <stdio.h>
#include <algorithm>
#define n 3

static int k=0;

struct ListNode
{
    int data;
    struct ListNode *next;
};
//主要是这部分得搞懂。
void Insert_Element(ListNode* &p,int data)
/*这里的参数传递一开始没写对,我写成了ListNode* p。
然后发现每次返回到主函数的时候,p的地址都没有改变。
如果是采取ListNode* p的形式,那就是指针传递,不是ListNode* &p的引用传递。
指针作为参数在函数中传递的时候,它的实质依然是值传递,形参只是实参的一份拷贝,他们分别属于不同的两个指针变量。

*/
{
    struct ListNode* q=(struct ListNode* )malloc(sizeof(ListNode));//需要申请一个新的结点
    q->data=data;
    p->next=q;//不能断链。这条语句使p的next指向q所指的结点
    p=q;//尾插法要求指针p始终指向最后一个结点。写成p=p->next也行。
    printf("p[%d]的地址=%p\n",k++,p);
    p->next=NULL;//如果这里不置为空,那么在主函数输出的时候,q!=NULL就会一直成立
}

int main()
{
    int data;
    struct ListNode* head=(struct ListNode* )malloc(sizeof(ListNode));//malloc需要algorithm
    printf("head的地址=%p\n",head);
    head->next=NULL;//带头结点
    struct ListNode* p=head;
    for(int i=0;i<n;i++)
    {
        printf("p[%d]->data=",i);
        scanf("%d",&data);
        Insert_Element(p,data);

    }
    struct ListNode* q=head->next;
    printf("链表为:");
    while(q!=NULL)
    {
        if(q->next!=NULL)
        {
            printf("%d->",q->data);
            q=q->next;
        }
        else
        {
            printf("%d",q->data);
            q=q->next;
        }
    }
    return 0;

}

运行结果:
在这里插入图片描述
在这里插入图片描述
主要实现算法:

q->data=data;
p->next=q;
p=q;
p->next=NULL;

在这里插入图片描述

头插法

#include <stdio.h>
#include <algorithm>
#define n 3

struct ListNode
{
    int data;
    struct ListNode *next;
};

void Insert_Element(ListNode* &head,int data)

{
    struct ListNode* q=(struct ListNode* )malloc(sizeof(ListNode));
    q->data=data;
    q->next=head->next;
    head->next=q;
}

int main()
{
    //头插法
    int data;
    struct ListNode* head=(struct ListNode* )malloc(sizeof(ListNode));//malloc需要algorithm
    head->next=NULL;//带头结点
    struct ListNode* p=head;
    for(int i=0;i<n;i++)
    {
        printf("p[%d]->data=",i);
        scanf("%d",&data);
        Insert_Element(head,data);

    }
    struct ListNode* q=head->next;
    printf("链表为:");
    while(q!=NULL)
    {
        if(q->next!=NULL)
        {
            printf("%d->",q->data);
            q=q->next;
        }
        else
        {
            printf("%d",q->data);
            q=q->next;
        }
    }
    return 0;
}

运行结果:
在这里插入图片描述
核心代码:

    q->data=data;
    q->next=head->next;
    head->next=q;

在这里插入图片描述
反思:是不是应该加个尾指针比较好呢?最后一个结点还没有指向NULL吧。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值