头插建立单链表

文章介绍了如何使用C语言实现一个带头指针的单链表,包括链表的初始化函数InitList和在链表头部插入节点的List_headInsert函数,以及主函数中对链表进行遍历的示例。
#include <iostream>


#include <stdio.h>
#include <stdlib.h>

using namespace std;

//带头指针的单链表

typedef  struct  LNode{
    int data;
    struct LNode *next;

}LNode, *LinkList;

bool InitList(LinkList &L){
    L = (LNode *) malloc(sizeof(LNode));
    if(L== NULL){
        return false;  //内存不足分配失败
    }
    L->next =NULL;
    return true;
}
bool empty(LinkList &L){
    return  (L->next==NULL);
}

LinkList List_headInsert(LinkList &L){

    LNode *s ;
    L->next =NULL;


    int x;
    scanf("%d",&x);
    while(x!=9999){
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);

    }
   
    return L;


}




int main(){
    LinkList L;
    InitList(L);

    List_headInsert(L);


   LNode *p = L->next;
   while(p){
       printf("%d \n",p->data);
       p=p->next;
   }












    return 0;
}
建立单链表是一种常用的链表创建方法,以下是其原理、实现步骤及代码示例: ### 原理 建立单链表的原理类似于在火车最前面加车厢,每次新节点都成为新的车。新节点总是入到链表的部,即结点之后,使得链表中的节点顺序与输入顺序相反 [^2]。 ### 实现步骤 1. **创建结点**:动态分配节点的内存空间,并将其`next`指针初始化为`NULL`。 2. **读取输入值**:读取用户输入的第一个值。 3. **循环入节点**:当输入值不是结束标志(如 -1)时,继续循环。 - 创建新节点:为新节点分配内存,并将输入值存入新节点的`data`域。 - 操作:将新节点的`next`指针指向原首节点(结点的`next`),然后将结点的`next`指针指向新节点。 - 读取下一个输入值。 4. **返回链表指针**:返回创建好的链表指针 [^1]。 ### 代码示例 #### C语言示例 ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct LNode { int data; struct LNode *next; } LNode, *LinkList; /** * 法创建链表(输入-1终止) * @return 返回创建好的链表指针 */ LinkList List_HeadInsert() { // 1. 创建结点 LinkList L = (LNode *)malloc(sizeof(LNode)); // 动态分配节点内存空间 L->next = NULL; // 初始化节点的next指针为NULL int x; // 用于存储用户输入的临时变量 scanf("%d", &x); // 2. 读取第一个输入值 // 3. 法循环入节点 while (x != -1) { // 3.1 创建新节点 LNode *S = (LNode *)malloc(sizeof(LNode)); // 为新节点分配内存 S->data = x; // 将输入值存入新节点的data域 // 3.2 法关键操作 S->next = L->next; // 新节点指向原首节点(结点的next) L->next = S; // 结点指向新节点(完成入) scanf("%d", &x); // 3.3 读取下一个输入值 } return L; // 4. 返回链表指针 } ``` #### C++示例 ```cpp #include <iostream> using namespace std; // 定义单链表结构体 struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* insertAtHead(ListNode* head, int value) { ListNode* newNode = new ListNode(value); newNode->next = head; return newNode; } int main() { ListNode* head = nullptr; // 初始化指针为空指针 for (int i = 0; i < 5; i++) { head = insertAtHead(head, i); // 入节点到部 } // 遍历单链表,输出节点值 ListNode* cur = head; while (cur) { cout << cur->val << "->"; cur = cur->next; } cout << "nullptr" << endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值