数据结构---单链表基础知识

单链表

一、定义链表结点结构体

头文件

#include <stdio.h>
#include <stdlib.h>//提供malloc()原型
#include <string.h>//提供memset()原型

结构体(定义别名方便书写)

typedef struct List_Node{
    int data;//数据域
    struct List_Node *next;//指针域
}L;

二、创建链表(头结点)

L *create_List()
{
    L *head_Node = (L *)malloc(sizeof(L));//动态内存申请
    memset(head_Node, 0, sizeof(L));//将原来数据清零
    head_Node->next = NULL;
    return head_Node;
}

三、创建新结点

L *create_Node(int Data)
{
    L *new_Node = (L *)malloc(sizeof(L));//动态内存申请
    memset(new_Node, 0, sizeof(L));
    new_Node->data = Data;//给数据域赋值
    new_Node->next = NULL;
    return new_Node;
}

四、头插法插入结点

每个结点的地址应储存在其前一个结点的next成员中。

void top_insert(L *head_Node, L *new_Node)
{
    if(head_Node->next != NULL)
        new_Node->next = head_Node->next;//新结点的next指向头结点的下一个结点
    head_Node->next = new_Node;//头结点的next指向新结点
}

五、尾插法插入结点

void tail_insert(L *head_Node, L *new_Node)
{
    while(head_Node->next != NULL){
        head_Node = head_Node->next;//找到链表中的最后一个结点
    }
    head_Node->next = new_Node;//最后一个结点的next指向新结点
}

六、删除结点

int delete_Node(L *head_Node, int Data)
{
    L *current = head_Node;
    L *prev = NULL;
    while(current->next != NULL){
        prev = current;
        current = current->next;
        if(current->data == Data)//找到要删除的结点了!
        {
            prev->next = current->next;
            free(current);
            return 0;
        }
    }
    printf("没有找到要删除的结点!\n");
    return -1;
}

七、打印链表

void print_List(L *head_Node)//从第二个结点开始打印
{
    while(head_Node->next != NULL){
        head_Node = head_Node->next;
        printf("%d ", head_Node->data);
    }
    printf("\n");
}

加入主函数测试

#include <stdio.h>
#include <stdlib.h>//提供malloc()原型
#include <string.h>//提供memset()原型

typedef struct List_Node{
    int data;//数据域
    struct List_Node *next;//指针域
}L;

//创建链表
L *create_List()
{
    L *head_Node = (L *)malloc(sizeof(L));
    memset(head_Node, 0, sizeof(L));
    head_Node->next = NULL;
    return head_Node;
}

//创建链表结点
L *create_Node(int Data)
{
    L *new_Node = (L *)malloc(sizeof(L));
    memset(new_Node, 0, sizeof(L));
    new_Node->data = Data;
    new_Node->next = NULL;
    return new_Node;
}

//头插法
void top_insert(L *head_Node, L *new_Node)
{
    if(head_Node->next != NULL)
        new_Node->next = head_Node->next;
    head_Node->next = new_Node;
}

//尾插法
void tail_insert(L *head_Node, L *new_Node)
{
    while(head_Node->next != NULL){
        head_Node = head_Node->next;//找到链表中的最后一个结点
    }
    head_Node->next = new_Node;
}

//打印链表
void print_List(L *head_Node)
{
    while(head_Node->next != NULL){
        head_Node = head_Node->next;
        printf("%d ", head_Node->data);
    }
    printf("\n");
}

//删除结点
int delete_Node(L *head_Node, int Data)
{
    L *current = head_Node;
    L *prev = NULL;
    while(current->next != NULL){
        prev = current;
        current = current->next;
        if(current->data == Data){
            prev->next = current->next;
            free(current);
            return 0;
        }
    }
    printf("没有找到要删除的结点!\n");
    return -1;
}

int main()
{
    L *list = create_List();
    top_insert(list, create_Node(10));
    top_insert(list, create_Node(20));
    top_insert(list, create_Node(30));
    tail_insert(list, create_Node(10));
    tail_insert(list, create_Node(20));
    tail_insert(list, create_Node(30));
    delete_Node(list, 30);
    delete_Node(list, 30);
    print_List(list);
    free(list);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值