栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单链表增删改查(c语言实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单链表增删改查(c语言实现)

作者为转行小白,刚接触数据结构算法,如有错误虚心接受批评指正。希望能够在计算机的学习过程中得到进步。

在查找代码中出现警告  取消对NULL 指针p的引用 尚未解决 ,有知道如何解决的小伙帮可以帮忙解释下 互相学习

单链表的查询

创建函数在另一个文章,本段只截取查询函数部分

void FindList(linkList L, int j,int e) {//查找数值为e在j位置
    linkList p = L->next;j = 1;             //j从0或1开始取决于p从头结点还是头指针开始
    if (p == NULL) { printf("链表无元素"); } //判断链表是否包含元素
    else {
        while (p && p->data != e) {    //p不为空且数据不等于e
            p = p->next;                //指向下一个结点
            j++;                       //指向下一个结点
        }
        if (p == NULL && p->data != e) {        //经上次循环退出后有两个结果
            printf("该链表中不包含元素%d", e);    //走到尾结点未发现e  
        }                                       
        else { printf("找到了元素在第%d位置", j);   //找到了元素e
        }   
    }
    free(p);
   
}

查找元素e并返回当前位置的 主函数

int main() {
    linkList L = 0;
    linkList q = 0;
    int arr[5] = { 1,2,3,4,5 }; //链表成员
    int  n= 0;   //链表总共n个  
    int j = 0;
    q=create(L, arr, n); //单链表建立
    //查找第i项
    FindList(q,j,5);   //查找链表里是否有3,返回位置j
    return 0;
}
单链表的删除(按值查找)

此代码未考虑到具有相同数值的情况,后续会增补上,删除之前可进行判断列表是否为空,为空则不需要进行,直接返回。单链表的删除核心在于将前驱结点直接与当前结点的后继节点相连。同时最后要注意到free掉 要删除的空间。

1、遍历列表,判断条件:遇到相等则停止进行下一步判断

2、判断是否有和输入数值相等的情况,有则删除并释放空间,没有则打印“未发现”

linkList DeleteList(linkList q,int j) {      //删除等于j的值
    linkList p=q;                        //设置p为头结点
    linkList w= p->next;                //设置w为p的前一个节点
    while(w&&w->data!=j){             //w不为空且w的数据域等于j
        p = w;                      
        w = w->next;                  //此两步为将p和w跳向下两个结点
    }
    if (w->data==j) {
        p->next = w->next;  //前驱p指向w的后继结点
        free(w);           //释放空间
    }
    else {
        printf("列表找过未发现值%d", j);
    }
    return q;
}
单链表的删除(按序查找)

1、遍历列表以count计数

2、判断输入数值是否在链表范围内

3、如果在范围内,删除项释放空间。如果不在打印 “输入数值不对”,

linkList DeleteList(linkList q,int j) {                    
    linkList t = q;                        //t为前驱,w为当前结点
    linkList w = t->next; int count = 1;  //以count来计数
    if (w==NULL) {                       //判断头结点的next域是否为空
        printf("链表已经空了");
    }
    else {
        while (w && countnext;             //后移
            count++;
        }
       
        if (w && count == j) {      //当前位置与输入数值相等则删除
            t->next = w->next; 
            free(w);           
        }
        else if(w==NULL) {           //当w为空时代表前驱的next域指向尾结点  
            printf("输入值不正确");   //表示走遍列表并为找到数值
        }

    }
    return q;
}
单链表的插入(第j位插入某数值)

链表的插入结合了链表头插法创建与删除的操作进行的步骤如下:

1、创建头结点w,计数器count;

2、遍历找到第j位(判断),

3、创建空间->输入数据域->连接节点与后继节点->连接前驱结点与后继节点

linkList AddList(linkList q, int j,int e){ //在第j位插入e
    linkList w = q->next;int count = 1;
    while (w&&countnext;
        count++;
    }
    if (w&&count==j) {
        if (create==NULL) {
            return NULL;
        }
        linkList create = (linkList)malloc(sizeof(node));    //插入需要创建新的空间
        create->data = e;
        create->next = w->next;
        w->next = create;
    }
    else if (w == NULL) {
        printf("输入数据错误");
    }
    return q;
}
修改单链表值(第j位的值更改)
linkList ChangeList(linkList q, int j,int e){ //在第j位插入e
    linkList Change = q->next;int count = 1;
    while (Change&&countnext;
        count++;    
    }
    if (Change && count == j) {
        Change->data = e;              //将data域数值改为输入数值
    }
    else if (Change == NULL){
        printf("位置不合理");
    }
    return q;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/352624.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号