前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言-单链表相关操作

C语言-单链表相关操作

作者头像
陈大剩博客
发布2023-03-06 09:03:43
5430
发布2023-03-06 09:03:43
举报
文章被收录于专栏:陈大剩博客专栏

复习C语言单链表其实并不顺利,网上查找教程标题是《C语言操作单链表》,内容却是C++; 当时看到*&link这种甚至搜索了一个多星期后面才搞明白二维指针其实* &==* *,只是C语言中并没有*&这样引用,只有C++才具有;

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

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

代码语言:javascript
复制
#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;
}

输入与输出

代码语言:javascript
复制
//输入
1
2
3
4
5
6
7
//输出
查找的值为:5 
输出的值为:3 
输出的值为:2 
输出的值为:7 
输出的值为:5 
输出的值为:4 
输出的值为:6 

printList函数执行,链表为空

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注意:严蔚敏的《数据结构 C语言版中》大部分代码是C++,C语言运行可能会报错(血的教训);
  • 输入与输出
  • 文章如有错误之处,欢迎大神指导。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档