0
点赞
收藏
分享

微信扫一扫

C语言 数据结构 单链表(带头节点)

hwwjian 2022-04-27 阅读 72
c语言

1、实现代码

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

#define ElemType int
#define MaxSize 10
#define true 1
#define false 0

typedef int bool;


//定义单链表节点
typedef struct LNode {
    ElemType data;
    struct LNode* next;
}LNode ,*LinkList;


LNode* Create_Header() {
    LNode * node = (LNode*)malloc(sizeof(LNode));
    node->next = NULL;
    if (node != NULL) {
        return node;
    }
    return NULL;
}

//头插法建立单链表
void Add_Node_Head(LNode* header,ElemType data) {
    LNode* node = (LNode*)malloc(sizeof(LNode));
    node->data = data;
    node->next = header->next;
    header->next = node;
}
//尾插法建立
void Add_Node_Tail(LNode* header, ElemType data) {
    LNode* node = (LNode*)malloc(sizeof(LNode));
    node->data = data;
    node->next = NULL;
    LNode* p = header;
    while (p) {
        if (NULL == p->next) {
            p->next = node;
            return;
        }
        p = p->next;
    }
    free(p);
}

//链表打印
void Print_LinkList(LNode *header) {
    if (Is_Empty(header)) {
        printf("链表为空");
        return;
    }
    LNode* p = header->next;
    int n = 0;
    while (p) {
        if (n % 10 == 0 && n / 10 != 0) {
            printf("\n");
        }
        printf("%d ", p->data);
        p = p->next;
    }
    free(p);
}

//判断是否为空
bool Is_Empty(LNode * header) {
    if (header->next == NULL) {
        return true;
    }
    return false;
}

LNode* Get_Node(LNode* header,ElemType data) {
    if (Is_Empty(header)) {
        return NULL;
    }
    LNode* p = header->next;
    while (p) {
        if (data == p->data) {
            return p;
        }
        p = p->next;
    }
    free(p);
    return NULL;
}

//在指定节点后插入
bool Af_Insert_Node(LNode* header, ElemType preData, ElemType data) {
    if (Is_Empty(header)) {
        printf("链表为空,无法插入");
        return false;
    }
    LNode* p = header->next;
    while (p) {
        if (preData == p->data) {
            LNode* node = (LNode*)malloc(sizeof(LNode));
            node->data = data;
            node->next = p->next;
            p->next = node;
            return true;
        }
        p = p->next;
    }
    free(p);
    return false;
}
//在指定节点前插入
bool Pre_Insert_Node(LNode* header, ElemType preData, ElemType data) {
    if (Is_Empty(header)) {
        printf("链表为空,无法插入");
        return false;
    }
    if (preData==header->next->data ) {
        LNode* node = (LNode*)malloc(sizeof(LNode));
        node->data = data;
        node->next = header->next;
        header->next = node;
        return true;
    }
    LNode* p = header->next;
    while (p) {
        if (p->next!=NULL&&preData == p->next->data) {
            LNode* node = (LNode*)malloc(sizeof(LNode));
            node->data = data;
            node->next = p->next;
            p->next = node;
            return true;
        }
        p = p->next;
    }
    free(p);
    return false;
}

//修改节点
bool Modify_Node(LNode* header ,ElemType oldData,ElemType newData) {
    if (Is_Empty(header)) {
        return false;
    }
    LNode* p = header;
    while (p) {
        if (oldData == p->data) {
            p->data = newData;
            return true;
        }
        p = p->next;
    }
    return false;
}

//删除节点
bool Delete_Node(LNode* header,ElemType data) {
    if (Is_Empty(header)) {
        return false;
    }
    LNode* p = header;

    if (data==header->next->data) {
        header->next = header->next->next;
        return true;
    }
    while (p) {
        if (p->next!=NULL&&data == p->next->data) {
            if (p->next->next == NULL) {
                p->next = NULL;
                return true;
            }
            p->next = p->next->next;
            return true;
        }
        p = p->next;
    }
    free(p);
    return false;
}
int main() {
    LNode* header= Create_Header();
    
    for (int i = 0; i < 10; i++){
        //Add_Node_Head(header, i);
        Add_Node_Tail(header, i);

    }
    Print_LinkList(header);

    printf("\n");
    printf("%d", Get_Node(header, 3)->data);

    printf("\n");
    Modify_Node(header, 3, 99);
    Print_LinkList(header);

    

    printf("\n");
    Pre_Insert_Node(header, 9, 123);
    Print_LinkList(header);

    printf("\n");
    Af_Insert_Node(header, 9, 456);
    Print_LinkList(header);

    
    printf("\n");
    Delete_Node(header, 0);
    Print_LinkList(header);
    printf("\n");
    Delete_Node(header, 123);
    Print_LinkList(header);
    printf("\n");
    Delete_Node(header, 456);
    Print_LinkList(header);


    return 0;
}
 

2、 运行结果

举报

相关推荐

0 条评论