c语言数据结构链表创建的四种方式

void main()
{
	Node *head = NULL;
	//第一种通过返回值来接收创建好的链表
	//Node * createLinkList(); 
	head = createLinkList();
	//第二种,传入指向结点的指针
	//void createLinkList(Node *head);
	createLinkList(head);
	//第三种,传入指向结点指针的指针
	//void createLinkList(Node **Phead);
	createLinkList(&head);
	
}

第一种:返回头指针去接收创建好的链遍,但是这种方式在使用的时候必须要有指针变量来接受创建的链表。这个不是强制要求的,别人在用我们写的程序时候,即使链表没有被接收也可以,也不会报错,不能强制别人去接收。所以这种方式不是很好。

/**
 * 根据用户输入的数据创建一个链表
 * */
Node * createLinkList()
{
    int length;
    printf("请输入结点个数");
    scanf("%d",&length);
    //生成一个结点
    Node *head = NULL;
    for(int i=0;i<length ;i++)
    {
        Node *p = (Node *)malloc(sizeof(Node));
        printf("请输入第一个结点存放的数据");
        scanf("%d",&p->data);
        p->next = NULL;
        Node *last = head;
        if(last)
        {
            //如果第一个结点不为空
            while(last->next)
            {
                last = last->next;
            }
            last->next = p;
        }
        else
        {
            //只有头指针,整个链表中没结点,则把头指针指向新生成的p结点
            head = p;
        }
    }
    return head;
    
}

第二种:如果我们只是传入指向结点的指针是无法改变函数外面的head的,所以我们要传入指向结点指针的指针
第二种不可行!

第三种传入指向结点指针的指针

/**
 * 传入指向结点指针的指针来创建链表
 * */
void createLinkList2(Node **Phead)
{
    int length;
    printf("请输入结点个数");
    scanf("%d",&length);
    for(int i=0;i<length;i++)
    {
        Node *p = (Node *)malloc(sizeof(Node));
        printf("请输入结点存放的数据");
        scanf("%d",&p->data);
        p->next = NULL;
        //找到最后一个结点
        Node *last = *Phead;
        if(last)
        {
            while(last->next)
            {
                last = last->next;
            }
            last->next = p;
        }
        else
        {
            *Phead = p;
        }
    }
}

第四种在工程中的拓展 自己在定义一种结构用来存放head, 这种方式的好处是我们可以在自己定义的结构中进行拓展。例如加上Node *tail;

/**
 * 第四种:自定一种结构来存放head
 * */
typedef struct _list{
    Node *head;
}List;

void createLinkList3(List *Plist)
{
    int length;
    printf("请输入结点个数");
    scanf("%d",&length);
    for(int i=0;i<length;i++)
    {
        Node *p = (Node *)malloc(sizeof(Node));
        printf("请输入结点存放的数据");
        scanf("%d",&p->data);
        p->next = NULL;
        //找到最后一个结点
        Node *last = Plist->head;//(修改为Plist->head)
        if(last)
        {
            while(last->next)
            {
                last = last->next;
            }
            last->next = p;
        }
        else
        {
        	//修改为Plist->head
            Plist->head = p;
        }
    }
}

由于参数改变使用时要做一些改变

 	List myList;
    myList.head = NULL;
    createLinkList3(&myList);
    //遍历链表
    printf("链表中的数据\n");
    for(Node *p = (&myList)->head;p;p= p->next)
    {
        printf("%d\n",p->data);
    }
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘璐菲

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

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

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

打赏作者

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

抵扣说明:

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

余额充值