【链表篇】单向链表入门与基本操作

  仅适合小白入门参考,本人也是小白,贴此学习

#include <stdio.h>

struct Node{
	int data;
	struct Node* next;
};

//创建链表
struct Node* createList(){
    struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
    //headNode成为了结构体变量
    //变量使用前必须初始化
    headNode->next = NULL;
    return headNode;
}

//创建节点
struct Node* createNode(int data){
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

//打印链表
void printList(struct Node* headNode){
    struct Node* pMove = headNode->next;
    while (pMove){
        printf("%d\t", pMove->data);
        pMove = pMove->next;
    }
    printf("\n");
}

//插入链表 头插法 插入哪个链表,插入节点的数据是多少
void insertNodeByHead(struct Node* headNode, int data){
    //创建插入的节点
    struct Node* newNode = createNode(data);
    //原本头节点后面的节点,移到要插入的节点后面,后退一个位置
    newNode->next = headNode->next;
    //要插入的节点紧跟头节点
    headNode->next = newNode;
}

//删除节点 以数据为参照删除 posdata为要删除的节点数据域对应的值
void deleteNodeByAppoint(struct Node* headNode, int posData){
    //从头节点之后的节点开始遍历,先判断这个节点的值是不是要找的值
    //这个节点之前的节点,自然是头节点
    struct Node* posNode = headNode->next;
    struct Node* posNodeFront = headNode;
    if (posNode == NULL){
        printf("无法删除,因为链表为空");
    }else{
        while (posNode->data != posData){
            //保持两个节点相邻,往后继续遍历
            posNodeFront = posNode;
            posNode= posNodeFront->next;
            if (posNode == NULL){
                printf("没有找到相关信息,无法删除\n");
                return;
            }
        }
        //如果没有走上面的while循环,说明找到了
        //这时候直接将目标节点前面节点的指针指向目标节点指向的指针,然后删除目标节点
        posNodeFront->next = posNode->next;
        free(posNode);
    }
}

int main(){
    //调用函数创建链表
    struct Node* list = createList();
    //往链表里插入数据
    insertNodeByHead(list, 1);
    insertNodeByHead(list, 2);
    insertNodeByHead(list, 3);
    //打印链表
    printList(list);
    //删除指定节点
    deleteNodeByAppoint(list, 2);
    printList(list);
    return 0;
}

 

展开阅读全文
©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值