基于C语言的非循环单链表的各种操作(包含完整代码实现)

首先需要两个头文件#include <stdio.h>和#include <stdlib.h>

1、定义链表结构体

typedef struct Node//定义链表结构体 
{
    int data;//数据域 
    struct Node *next;//指针域 
}Node;

2、初始化头节点

Node *iniList()
{
    Node *list = (Node*)malloc(sizeof(Node));//创建一个空指针域 
    list->data = 0;//该指针的data置为0 
    list->next = NULL;//该指针指向空 
    return list;//返回该链表(head指针) 
}

3、头插法创建单链表

void headList(Node *list,int data)
{
    Node *node = (Node*)malloc(sizeof(Node));//开辟空间 
    node->data = data;//向新建的指针data域中写入数据 
    node->next = list->next;//新建的指针指向头节点的下一个节点 
    list->next = node;//头节点指向新建的节点 
    list->data++;//头节点中的data域数字加一代表链表插入一个元素 
}

4、尾插法创建单链表

void tailList(Node *list,int data)
{
    Node *node = (Node *)malloc(sizeof(Node));//同上 
    Node *head = list;//保存头节点 
    node->data = data;//将数据写入新建的节点的data域中 
    node->next = NULL;//因为是尾插法所以新建的节点必定是最后节点,指向空 
    list = list->next;//第一个节点是头节点,所以list要向后走一步 
    while(list->next)//判断节点是否为空,不为空就一直往后走直到最后一个节点 
        list = list->next;
    list->next = node;//新建节点链接在最后一个节点后面 
    head->data++;//同上 
}

5、删除节点

void deleteList(Node *list,int data)
{
    Node *current = list->next;//删除一个节点需要当前节点的指针 
    Node *pre = list;//删除一个节点也需要前一个节点的指针 
    current = current->next;//头节点的下一个节点才是第一个节点 
    while(current->next!=NULL)//循环遍历所有节点 
    {
        if(current->data==data)//找到符合节点的data域数据则进入循环 
        {/*要删除当前节点首先需要前一个节点指向当前节点的下一个节点,
        也就是前一个节点跨过当前节点指向下下一个节点*/ 
            pre->next = current->next; 
            free(current);//链接后,释放当前节点
            list->data--;//头指针data域减一 
            break;//退出循环 
        }
        else/*没有找到符合条件的节点,
        则当前节点指针赋值给上一个节点指针,
        当前节点指向下一个节点(也就是两个节点同时往后移动一个位置)*/
        {
            pre = current;
            current = current->next;
        }
    }
}

6、遍历输出

void printList(Node *list)
{
    list = list->next;//头节点的下一个节点才是第一个节点 
    while(list)//循环条件list不为空 
    {
        printf("%d ",list->data);//输出list指向的data域 
        list = list->next;//指针往后走 
    }
    printf("\n");
}

7、主函数测试各个模块

int main()
{
    int i;
    Node *list = iniList();//初始化头节点 
    for(i=1;i<=5;i++)
        headList(list,i);//验证头插法函数 
    for(i=6;i<=10;i++)
        tailList(list,i);//验证尾插法函数 
    printList(list);//验证遍历输出函数 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值