数据结构-链表的基本操作

一、链表的基本操作

1.初始化

// 1、初始化链表
void initLink(){
	Link* head = (Link*)malloc(sizeof(Link)); // 创建头节点
	head->val = 0;
	head->next = NULL;
    Link* p = head; // 创建指针指向链表
    for(int i = 0; i < 5; i++){
        Link* temp = (Link*)malloc(sizeof(Link));
        temp->val = i; // 给节点赋值
        temp->next = NULL;
        p->next = temp; // 将节点加入链表
        p = p->next; // 移动指针
    }
}

2.显示

// 2、显示链表
void displayLink(Link* head){
    Link* p = head->next; // 创建指针指向链表
    while(p != NULL){
        printf("%d ", p->val);
        p = p->next;
    }
    puts("\r\n");
}

3.插入节点

// 3、链表插入节点
void insertLink(Link* head, int address, int val){
    int find = 0;
    Link* p = head; // 创建指针指向链表
    // 采用头插
    if(address == 1) {
        Link* temp = (Link*)malloc(sizeof(Link)); // 创建临时节点
        temp->val = val;
        temp->next = p->next;
        p->next = temp;
        find = 1;
        puts("插入成功!\n");
    }
    else{
        // 指定位置插入
        while(p != NULL){
            if(address == 0){
                Link* temp = (Link*)malloc(sizeof(Link));
                temp->val = val;
                temp->next = p->next;
                p->next = temp;
                find = 1;
                puts("插入成功!\n");
                break;
            }
            address--;
            p = p->next;
        }
    }
    if(find == 0)
        puts("插入位置有误,请检查!\r\n");
}

4.删除节点

// 4、删除节点
void delLink(Link* head, int val){
    Link* p = head;
    int find = 0;
    while(p->next != NULL){
        if(p->next->val == val){
            p->next = p->next->next;
            find = 1;
            puts("删除成功\n");
            break;
        }
        p = p->next;
    }
    if(find == 0)
        puts("未找到目标节点,请检查!\n");
}

5.更改节点值

// 5、修改节点的值
void modifedVal(Link* head, int address, int val){
    Link* p = head;
    int find = 0;
    while(p != NULL){
        if(address == 0){
            p->val = val;
            find = 1; 
            break;
        }
        p = p->next;
        address--;
    }
    if(find == 0){
        puts("修改位置有误,请检查!\n");
    }
}

6.查找节点值

// 6、查找节点
void findLink(Link* head, int val){
    Link* p = head;
    int idx = 0;
    int find = 0;
    while(p != NULL){
        if(p->val == val){
            find = 1;
            printf("找到目标节点,位置为第%d个节点\n", idx);
            break;
        }
        p = p->next;
        idx++;
    }
    if(find == 0) puts("没有找到目标节点,请检查!\n");
}

二、汇总

#include <stdio.h>  
#include <stdlib.h>  
  
// 定义链表
typedef struct LinkList{
    struct LinkList* next;
    int val;
}Link;


void initLink(Link* head);
void displayLink(Link* head);
void insertLink(Link* head, int address, int val);
void delLink(Link* head, int val);
void modifedVal(Link* head, int address, int val);
void findLink(Link* head, int val);

int main(void){
    Link* head = (Link*)malloc(sizeof(Link)); // 创建头节点
    head->val = 0;
    head->next = NULL;
    initLink(head);
    displayLink(head);
    
    insertLink(head, 3, 4);
    displayLink(head);

    delLink(head, 4);
    displayLink(head);

    modifedVal(head, 2, 10);
    displayLink(head);

    findLink(head, 4);
    displayLink(head);

    free(head);
    return 0;
}
// 1、初始化链表
void initLink(Link* head){
    Link* p = head; // 创建指针指向链表
    for(int i = 0; i < 5; i++){
        Link* temp = (Link*)malloc(sizeof(Link));
        temp->val = i; // 给节点赋值
        temp->next = NULL;
        p->next = temp; // 将节点加入链表
        p = p->next; // 移动指针
    }
}

// 2、显示链表
void displayLink(Link* head){
    Link* p = head->next; // 创建指针指向链表
    while(p != NULL){
        printf("%d ", p->val);
        p = p->next;
    }
    puts("\r\n");
}

// 3、链表插入节点
void insertLink(Link* head, int address, int val){
    int find = 0;
    Link* p = head; // 创建指针指向链表
    // 采用头插
    if(address == 1) {
        Link* temp = (Link*)malloc(sizeof(Link)); // 创建临时节点
        temp->val = val;
        temp->next = p->next;
        p->next = temp;
        find = 1;
        puts("插入成功!\n");
    }
    else{
        // 指定位置插入
        while(p != NULL){
            if(address == 0){
                Link* temp = (Link*)malloc(sizeof(Link));
                temp->val = val;
                temp->next = p->next;
                p->next = temp;
                find = 1;
                puts("插入成功!\n");
                break;
            }
            address--;
            p = p->next;
        }
    }
    if(find == 0)
        puts("插入位置有误,请检查!\r\n");
}

// 4、删除节点
void delLink(Link* head, int val){
    Link* p = head;
    int find = 0;
    while(p->next != NULL){
        if(p->next->val == val){
            p->next = p->next->next;
            find = 1;
            puts("删除成功\n");
            break;
        }
        p = p->next;
    }
    if(find == 0)
        puts("未找到目标节点,请检查!\n");
}

// 5、修改节点的值
void modifedVal(Link* head, int address, int val){
    Link* p = head;
    int find = 0;
    while(p != NULL){
        if(address == 0){
            p->val = val;
            find = 1; 
            break;
        }
        p = p->next;
        address--;
    }
    if(find == 0){
        puts("修改位置有误,请检查!\n");
    }
}

// 6、查找节点
void findLink(Link* head, int val){
    Link* p = head;
    int idx = 0;
    int find = 0;
    while(p != NULL){
        if(p->val == val){
            find = 1;
            printf("找到目标节点,位置为第%d个节点\n", idx);
            break;
        }
        p = p->next;
        idx++;
    }
    if(find == 0) puts("没有找到目标节点,请检查!\n");
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值