纯C语言创建(带与不带头节点)单链表、头插法、尾插法、删除、遍历、逆转

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

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


}Node;


//创建带头结点的单链表

Node* initNode() {
    Node* Head = (Node*)malloc(sizeof(Node));//
    Node *L = Head;//链表L申请内存
    Node* LNew;
    L->next = NULL;
    for (int i = 0; i < 5; i++) {
        LNew = (Node*)malloc(sizeof(Node));
        LNew->next = NULL;
        LNew->data = i;
        L->next = LNew;
        L = LNew;

    }
    return Head;//将头节点指针所带的地址传回去

}
//头插法(有头节点)
void headInsert(Node** L, int i) {

    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = i;
    
    temp->next = (*L)->next;
    (*L)->next = temp;
}
//尾插法(有头节点)

void tailInsert(Node** L, int i) {
    Node* p = *L;//创建指针p遍历链表,直到p->next==NULL时停止。
    Node* temp = (Node*)malloc(sizeof(Node));
    temp->data = i;
    while (1) {
        if (p->next == NULL)
            break;
        p = p->next;
    }
    p->next = temp;
    temp->next = NULL;

}
//删除链表某数值对应的节点
void deleteNode(Node** L, int e) {
    if ((*L == NULL))
        return;
    if ((*L)->data == e) {
        *L = (*L)->next;

    }
    else {
        
        deleteNode(&(*L)->next, e);
    }


}
//遍历单链表(带头结点)
void prNode(Node* L) {
    Node* node = L->next;
    while (node)//当node=NULL时 ,循环停止
    {
        printf("node=%d\n", node->data);
        node = node->next;

    }

}

int main() {
    
    //初始化赋值链表(属于尾插法)
    Node*L=initNode();
    
    //头插法赋值
    headInsert(&L, 99);//函数参数要用Node**类型的,Node*类型的无法修改指针L的值,&获取指针L的地址。


    //尾插法赋值


    tailInsert(&L, 66);

    //删除链表某数值
    deleteNode(&L, 2);


    
    //遍历链表

    prNode(L);

        return 0;

----------------------------------------------------------------------------------------------------------------------------------

#include<stdio.h>
#include<stdlib.h>
typedef struct Node {

    int data;
    struct Node* next;

}Node;
//单链表的创建
Node* InitList() {
    //带头结点
    /*Node* Head,* L, *LNew;
    Head = (Node*)malloc(sizeof(Node)); 
    L = Head;
    
    L->next = NULL;
    for (int i = 0; i < 3; i++) {
        Node* LNew = (Node*)malloc(sizeof(Node));
        LNew->data = i;
        LNew->next = NULL;
        L->next = LNew;
        L = LNew;

    }*/
    
    //不带头结点
    Node* Head, * L, * LNew;
    
    Head = (Node*)malloc(sizeof(Node));
    L = Head = NULL;
    
    
    for (int i = 0; i < 5; i++) {
    LNew = (Node*)malloc(sizeof(Node));
    LNew->data = i;
    LNew->next = NULL;
    if (L == NULL) {
        L = Head = LNew;

    }
    else {
        L->next = LNew;
    }
    L = LNew;
    }


    return Head;
}
//头插法插入数据
void headInsert(Node** L, int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    if (L == NULL) {
        *L = node;
        (*L)->next = NULL;

    }
    if (node == NULL) {
        printf("头插入失败!");
        exit(1);
    }
    else {
        
        
        node->next = *L;
        *L = node;
        
    }
    
}


//尾插法插入数据

void tailInsert(Node** L, int data) {

    Node* node = *L;
    while(1){
        node = node->next;
        if (node->next == NULL)
            break;

    }
    Node* n = (Node*)malloc(sizeof(Node));
    if (n == NULL) {
        printf("尾插入失败!\n");
        exit(1);

    }
    else
    {
        n->next = NULL;
        n->data = data;
        node->next = n;
    }
}
//删除链表
void deleteNode(Node** L,int i) {

    
    if (*L == NULL)
        return;
    if ((*L)->data == i)
    {
        
        *L = (*L)->next;
        /*
       使原本指向当前结点的指针指向下一个结点[等价于L->next = L->next->next],
       因此下面的语言不会断链
       */

        
        deleteNode(L, i);
    }
    else {
    
        deleteNode(&((*L)->next), i);
    }
}

//遍历链表

void PrList(Node* L) {
    Node* node = L;
    while (node) {
        printf("node=%d\n", node->data);
        node = node->next;
    }
}

//逆转链表
//建立新的链表
(浪费内存空间,不推荐)

Node* reverseNode1(Node* L) {
    Node* node = (Node*)malloc(sizeof(Node));
    
    node  = NULL;
    while (L!= NULL) {
    Node* LNew = (Node*)malloc(sizeof(Node));
        LNew->data = L->data;
    if (node==NULL) {
        node = LNew;
        node->next = NULL;
        }
    else {
        
        LNew->next = node;
        node = LNew;
        }
    L = L->next;
    }
    
    return node;
}

//创建三个指针逆转链表

Node* reverseNode2(Node* L) {
    Node* p, * q, * r;
    p = L;
    
    q = p->next;
    p->next = NULL;
    
    r = q->next;
    for (; r != NULL;r = q->next) {
        
        q->next = p;
        p = q;
        q = r;

    }
    q->next = p;
    return q;
}


int main() {
    Node* L = InitList();

    headInsert(&L, 99);
    
    tailInsert(&L, 66);

    deleteNode(&L, 2);

    PrList(L);

        return 0;
}

 

 本人水平有限,如有不对的地方欢迎大神斧正!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值