单链表头插法、尾插法(C语言)

本文介绍了C语言中如何使用头插法和改进的尾插法创建并打印单链表,包括定义LNode结构体,内存分配以及插入节点的操作。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{  //定义单链表结点类型
    int data; //数据域
    struct LNode *next;  //指针域
}LNode,*LinkList;
LinkList Head_Insert(){  //逆向建立单链表
    LNode *s; int x;
    LinkList L = (LinkList)malloc(sizeof(LNode));  //创建头结点
    L->next = NULL;  //初始指向空链表
    /*scanf("%d",&x);  //输入结点的值  (用&的我都编译不了,只能用指针,可能因为我是用菜鸟工具编译的?)
    while(x != 9999){  //输入9999时结束
        s = (LinkList)malloc(sizeof(LNode));  //创建新节点
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);        
    }*/
    char ar[4] = {'a','b','c','d'};
    int length = sizeof(ar)/sizeof(ar[0]);
    for(int i = 0; i < length; i++){
        s = (LinkList)malloc(sizeof(LNode));  
        s->data = ar[i];
        s->next = L->next;
        L->next = s;
    }
    return L;    
}
LinkList Last_Insert(){
    LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点
    L->next = NULL;  //初始指向空链表
    LNode *q = L;  //创建尾指针
    char ar[4] = {'a','b','c','d'};
    int length = sizeof(ar)/sizeof(ar[0]);
    for(int i = 0; i < length; i++){
        LNode *s = (LinkList)malloc(sizeof(LNode)); //新建结点
        s->data = ar[i]; //填充数据域
        q->next = s;  //尾指针指向新节点
        s->next = NULL;  //新节点指针域置空
        q = q->next;  //更新尾指针(其实有点不明白为啥得更新尾指针,前面尾指针的指针域不是已经指向新节点了吗?)
    }
    return L;
}
int main()
{
    LinkList L;
    L = Head_Insert(&L);   //头插法
    while(L){  //打印链表
        printf("%c",L->data);
        L = L->next;
    }
    printf("\n");
    L = Last_Insert(&L);  //尾插法
    while(L){  //打印链表
        printf("%c",L->data);
        L = L->next;
    }
}

C语言菜鸟,最近才开始捡起来,如有错误请各位大佬指出!

20230821 更新 ------------------------------------------------------------------------------------------------------------

我发现用下面这种方法比较好理解尾插法

LinkList Last_Insert2(){    
    LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点
    L->next = NULL;  //初始指向空链表
    LNode *temp = L;
    char ar[4] = {'a','b','c','d'};
    int length = sizeof(ar)/sizeof(ar[0]);
    for(int i = 0; i < length; i++){
        LNode *s = (LinkList)malloc(sizeof(LNode)); //新建结点
        s->data = ar[i];  //数据域赋值
        while(temp->next != NULL){  //定位到末尾结点
            temp = temp->next;
        }
        temp->next = s;  //末尾指针结点指向新结点
        s->next = NULL;  //新结点指针域置空
    }
    return L;    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值