C语言-单链表相关操作

简介: 复习C语言单链表其实并不顺利,网上查找教程标题是《C语言操作单链表》,内容却是C++;当时看到*&link这种甚至搜索了一个多星期;

复习C语言单链表其实并不顺利,网上查找教程标题是《C语言操作单链表》,内容却是C++;

当时看到*&link这种甚至搜索了一个多星期

后面才搞明白二维指针其实* &==* *,只是C语言中并没有*&这样引用,只有C++才具有;

注意:严蔚敏的《数据结构 C语言版中》大部分代码是C++,C语言运行可能会报错(血的教训);

单链表操作平均时间负杂度为O(n)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
    int data;
    struct Link *next;
} link;
void initList(link **list);
void createNode(link **list);
void getInput(link *list);
void insertHeadNode(link *list);
void insertTailNode(link *list);
void freeList(link **list);
void insertRandNode(link *list, int add);
void selectNode(link *list, int add);
void amendNode(link *list, int add);
//初始化链表
void initList(link **list) {
    //申请头节点
    link *temp, *p = (link *) malloc(sizeof(link));
    if (p == NULL) {
        printf("%s函数执行,申请内存失败\n", __FUNCTION__);
    }
    p->data = NULL;
    createNode(&temp);
    p->next = temp;
    *list = p;
}
//获取输入值
void getInput(link *list) {
    link *temp = list;
    printf("请输入值\n");
    temp->next = NULL;
    scanf("%d", &temp->data);
}
//创建节点
void createNode(link **list) {
    link *temp = (link *) malloc(sizeof(link));
    if (temp == NULL) {
        printf("%s函数执行,申请内存失败\n", __FUNCTION__);
    }
    getInput(temp);
    *list = temp;
}
//头插法
void insertHeadNode(link *list) {
    link *temp = NULL, *p = list;
    createNode(&temp);
    if (p->next == NULL) {
        printf("%s函数执行,头结点为空\n", __FUNCTION__);
    }
    temp->next = p->next;
    p->next = temp;
}
//尾插法
void insertTailNode(link *list) {
    link *temp = NULL, *p = list;
    createNode(&temp);
    if (p == NULL) {
        printf("%s函数执行,链表为空\n", __FUNCTION__);
    } else {
        while (p->next) {
            p = p->next;
        }
        p->next = temp;
    }
}
//插入指定位置
void insertRandNode(link *list, int add) {
    link *p = list, *temp;
    int i;
    for (i = 1; i < add; i++) {
        if (p == NULL) {
            printf("%s函数执行,插入位置无效\n", __FUNCTION__);
        }
        p = p->next;
    }
    createNode(&temp);
    temp->next = p->next;
    p->next = temp;
}
//查找节点
void selectNode(link *list, int add) {
    link *temp = list;
    int i;
    for (i = 1; i <= add; i++) {
        if (temp == NULL) {
            printf("%s函数执行,查询位置无效\n", __FUNCTION__);
        }
        temp = temp->next;
    }
    printf("查找的值为:%d \n", temp->data);
}
//修改节点
void amendNode(link *list, int add) {
    link *temp = list;
    int i;
    for (i = 1; i <= add; i++) {
        if (temp == NULL) {
            printf("%s函数执行,查询位置无效\n", __FUNCTION__);
        }
        temp = temp->next;
    }
    printf("请输入修改的值\n");
    scanf("%d", &temp->data);
}
//清空链表
void freeList(link **list) {
    link *temp = *list;
    link *del = NULL;
    if (temp == NULL) {
        printf("%s函数执行,链表为空\n", __FUNCTION__);
    } else {
        while (temp->next) {
            del = temp;
            temp = temp->next;
            free(del);
        }
    }
    del = temp;
    free(del);
    *list = NULL;
}
//打印链表
void printList(link *list) {
    link *temp = list;
    if (temp == NULL) {
        printf("%s函数执行,链表为空\n", __FUNCTION__);
    } else {
        while (temp->next) {
            temp = temp->next;
            printf("输出的值为:%d \n", temp->data);
        }
    }
    putchar('\n');
}
int main() {
    link *list;
    initList(&list);
    insertHeadNode(list);
    insertHeadNode(list);
    insertTailNode(list);
    amendNode(list, 3);
    insertTailNode(list);
    insertRandNode(list, 3);
    selectNode(list, 4);
    printList(list);
    freeList(&list);
    printList(list);
    return 0;
}


输入与输出

//输入
1
2
3
4
5
6
7
//输出
查找的值为:5 
输出的值为:3 
输出的值为:2 
输出的值为:7 
输出的值为:5 
输出的值为:4 
输出的值为:6 
printList函数执行,链表为空


文章如有错误之处,欢迎大神指导。


目录
相关文章
|
2月前
|
存储 C语言
C语言单链表实现
一个用C语言编写的简单学生信息管理系统,该系统具备信息输入、成绩计算、排序、删除、查找、修改、保存和读取文件等功能。
29 0
C语言单链表实现
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
658 6
|
3月前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
3月前
|
算法 C语言 开发者
C语言手撕实战代码_单链表
本文档详细介绍了使用C语言实现单链表的各种基本操作和经典算法。内容涵盖单链表的构建、插入、查找、合并及特殊操作,如头插法和尾插法构建单链表、插入元素、查找倒数第m个节点、合并两个有序链表等。每部分均配有详细的代码示例和注释,帮助读者更好地理解和掌握单链表的编程技巧。此外,还提供了判断子链、查找公共后缀等进阶题目,适合初学者和有一定基础的开发者学习参考。
|
5月前
|
语音技术 C语言 Windows
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
语音识别------ffmpeg的使用01,ffmpeg的安装,会做PPT很好,ffmpeg不具备直接使用,只可以操作解码数据,ffmpeg用C语言写的,得学C语言,ffmpeg的安装
|
6月前
|
存储 人机交互 C语言
【C语言项目实战】使用单链表实现通讯录
【C语言项目实战】使用单链表实现通讯录
|
6月前
|
C语言
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
C语言---函数--数组---创建一个整形数组,完成对数组的3种操作
|
7月前
|
存储 C语言
c语言:文件处理操作-3
c语言:文件处理操作
51 0
|
7月前
|
C语言 C++
c语言:文件处理操作-2
c语言:文件处理操作
45 0
|
7月前
|
存储 编译器 C语言
c语言:文件处理操作-1
c语言:文件处理操作
33 0