C语言实现带头节点的单链表

本文介绍如何使用C语言实现链表的基本操作,包括初始化、创建节点、头插法、尾插法、删除节点、显示元素、获取链表长度以及按位置插入。通过示例展示了链表管理的关键函数及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE  1
typedef struct _node
{
    int data;
    struct _node *next;
}Node;

Node *initLinkedList();//初始化链表
Node *createNode(int data);//创造链表节点
int insertByHead(Node *headNode,int data);//头插法
int insertByTail(Node *headNode,int data);//尾插法
void displayAll(Node *headNode);//显示链表所有元素
int getLength(Node *headNode);//获得链表长度,有多少个元素
int insert(Node *headNode,int pos,int data);//按照位置插入
int delNode(Node *headNode,int pos);//删除链表中的节点
int cleanLinkedList(Node *headNode);//清空链表
int main(int argc, char **argv)
{
    Node *node = initLinkedList();
    
    insertByTail(node,10);
    insertByTail(node,20);
    insertByTail(node,30);
    insertByTail(node,40);
    displayAll(node);
    printf("length:%d\n",getLength(node));
    delNode(node,0);
    displayAll(node);
    printf("length:%d\n",getLength(node));
}
/******************************
 * 功能 删除链表中的节点
 * 返回 int
 * 输入 链表头节点 删除的位置
 * ******************************/
int delNode(Node *headNode,int pos){
    if(pos <= 0 || pos > getLength(headNode)) return FALSE;
    Node *p = headNode;
    Node *q;
    int i = 1;
    for(i;i<pos;i++){
        p = p->next;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return TRUE;
}
/******************************
 * 功能 清空单链表中的所有元素
 * 返回 int
 * 输入 链表的头节点
 * ***************************/
int cleanLinkedList(Node *headNode){
    if (headNode->next == NULL) return FALSE;
    Node *p=headNode,*q;
    while (p->next)
    {
        q = p->next;
        p->next = q->next;
        free(q);
    }
    return TRUE;
}
/***********************
 * 功能 初始化链表,建立链表的头指针
 * 返回 返回链表的头指针
 * 输入 void
 * *************************/
Node *initLinkedList(){
    Node *headNode = (Node *)malloc(sizeof(Node));
    headNode->next = NULL;
    return headNode;
}
/*************************
 * 功能 建立链表节点
 * 返回 含有数据的新节点
 * 输入 int
 * **********************/
Node *createNode(int data){
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}
/*****************************
 * 功能 头插法插入链表元素
 * 返回 int
 * 输入 链表头节点,数据
 * **************************/
int insertByHead(Node *headNode,int data){
    if (headNode == NULL) return FALSE;
    Node *newNode = createNode(data);
    newNode->next = headNode->next;
    headNode->next = newNode;
    return TRUE;
}
/********************************
 * 功能 尾插法插入链表元素
 * 返回 int
 * 输入 链表头节点,数据
 * *****************************/
int insertByTail(Node *headNode,int data){
    if (headNode == NULL) return FALSE;
    Node *newNode = createNode(data);
    Node *p = headNode;
    while(p->next!=NULL){
        p=p->next;
    }//找到最后一个节点
    p->next = newNode;
    return TRUE;
}
/*******************************
 * 功能 显示链表所有元素
 * 返回 void
 * 输入 链表头节点
 * ****************************/
void displayAll(Node *headNode ){
    Node *p = headNode->next;
    int i = 1;
    while (p!=NULL)
    {
        printf("第 %d 个 元素: %d\n",i,p->data);
        p = p->next;
        i++;
    }
}
/**********************************
 * 功能 获得链表长度,链表有多少个节点
 * 返回 int
 * 输入 链表头节点
 * **********************************/
int getLength(Node *headNode){
    int i = 0;
    Node *p = headNode->next;
    while (p!=NULL)
    {
        p = p->next;
        i++;
    }
    return i ;
}

/**********************
 * 功能 按照位置插入节点
 * 返回 int
 * 输入 链表头节点 位置 数据
 * **********************/
int insert(Node *headNode,int pos,int data){
    if(headNode->next==NULL) return FALSE;
    if(pos <= 0 || pos >  getLength(headNode) + 1 ) return FALSE;
    int i = 1;
    Node *p = headNode;
    Node *newNode = createNode(data);
    for(i;i<pos;i++){
        p = p->next;
    }
    newNode->next = p->next;
    p->next = newNode;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值