数据结构(C语言版)实现单链表的创建,赋值随机数,插入,删除,取值,输出

简介: 数据结构(C语言版)实现单链表的创建,赋值随机数,插入,删除,取值,输出

数据结构(C语言版)实现单链表的创建,赋值随机数,插入,删除,取值,输出

1、实现了...

实现了自定义创建链表的大小

实现了链表的随机赋值

实现了自定义插入,删除,取值

实现了输出链表的每个结点

2、什么是单链表

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

3、样例

20201102200848529.gif

4、干货

定义一个结构体类型
//定义链表结构体typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
创建L头结点,L当列表
//创建头结点LStatusInitList(LinkList&L){
L=newLNode;      //为L分配空间L->next=NULL;      //头结点的指针域为空}
获取在L列表中第i个结点的存的数据
//获取L链表第i个结点存储的数据给eStatusGetElem(LinkList&L,inti,ElemType&e){
LNode*p;
p=L->next;
intj=1;
while(p&&j<i){
p=p->next;
j++;
    }
if(!p||j>i)    //如果为空或超过链表的大小,报错returnError;
e=p->data;
returnOk;
}
插入,在L链表中插入一个数据e,第i个位置
//插入,在L链表的第i个位置插入数据eStatusListInsert(LinkList&L,inti,ElemTypee){
LNode*p,*s;
intj=0;
p=L;
while(p&&j<(i-1)){
p=p->next;
j++;
    }
if(!p||j>i-1)       //如果为空或超过列表的大小,报错returnError;
s=newLNode;    //为新结点new一个分配空间s->data=e;         //新结点s的数据域存储es->next=p->next;     //新结点s的指针域存储 p 原本指向结点的地址p->next=s;         //p的指针域存储s的地址returnOk;
}
删除L链表中第i个结点
//删除 删除L链表中第i个StatusListDelete(LinkList&L,inti){
LNode*p,*s;
intj=0;
p=L;
while((p->next)&&j<(i-1))
    {
p=p->next;
j++;
    }
if(!p->next||j>i-1)  //如果为空或者超过列表的大小,报错returnError;
s=p->next;
p->next=s->next;   //将s指向的地址给p的指针域deletes;         //删除s结点returnOk;
}
链表赋值——随机值
StatusCreateList(LinkList&L,inti){
for(intn=1;i>=n;i--) {       //链表的每个结点插入随机数ListInsert(L,1,rand());
    }
returnOk;
}
输出链表每个结点的数据和位置
voidput(LinkList&L){
LNode*p;
inti=1;
p=L->next;  //p等于头结点L指向的结点,跳过头结点(头结点不存储数据)while(p){     //遍历输出链表L的每个结点cout<<p->data<<":"<<i<<"\t";
p=p->next;
i++;
    }
cout<<"\n";
}
主函数main方法


//主函数intmain(){
inte,n,a,b;
LinkListL;             //定义头结点L当作列表InitList(L);        //创建头结点Lcout<<"输入要随机创建的列表大小(>0):\n";
cin>>n;
CreateList(L,n);    //为链表L随机赋值cout<<"链表:"<<"\n" ;
put(L);                 //输出链表的各个结点cout<<"输入要插入的位置:\n";
cin>>a;
cout<<"输入要插入的数据:\n";
cin>>b;
ListInsert(L,a,b);       //在链表L的第2个结点插入数据99cout<<"插入之后的链表:"<<"\n" ;
put(L);              //输出执行插入语句之后的链表Lcout<<"输入要删除的结点:\n";
cin>>a;
ListDelete(L,a);         //删除单链表L中第2个结点cout<<"删除之后的链表:"<<"\n" ;
put(L);             //输出删除之后的链表cout<<"输入要获取数据的结点:\n";
cin>>a;
GetElem(L,a,e);         //获取单链表L中第2个结点存的数据给ecout<<"L链表第"<<a<<"个结点的数据为:"<<e<<"\n" ;
cout<<e;          //输出ereturn0;
}

5、源码

#include<iostream>#include<stdio.h>#include<stdlib.h>//用到随机数rand()usingnamespacestd;
typedefintElemType;
typedefintStatus;
#defineError0#defineOk1//定义链表结构体typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
//创建头结点LStatusInitList(LinkList&L){
L=newLNode;      //为L分配空间L->next=NULL;      //头结点的指针域为空}
//获取L链表第i个结点存储的数据给eStatusGetElem(LinkList&L,inti,ElemType&e){
LNode*p;
p=L->next;
intj=1;
while(p&&j<i){
p=p->next;
j++;
    }
if(!p||j>i)    //如果为空或超过链表的大小,报错returnError;
e=p->data;
returnOk;
}
//插入,在L链表的第i个位置插入数据eStatusListInsert(LinkList&L,inti,ElemTypee){
LNode*p,*s;
intj=0;
p=L;
while(p&&j<(i-1)){
p=p->next;
j++;
    }
if(!p||j>i-1)       //如果为空或超过链表的大小,报错returnError;
s=newLNode;    //为新结点new一个分配空间s->data=e;         //新结点s的数据域存储es->next=p->next;     //新结点s的指针域存储 p 原本指向结点的地址p->next=s;         //p的指针域存储s的地址returnOk;
}
//删除 删除L链表中第i个StatusListDelete(LinkList&L,inti){
LNode*p,*s;
intj=0;
p=L;
while((p->next)&&j<(i-1))
    {
p=p->next;
j++;
    }
if(!p->next||j>i-1)  //如果为空或者超过链表的大小,报错returnError;
s=p->next;
p->next=s->next;   //将s指向的地址给p的指针域deletes;         //删除s结点returnOk;
}
//为链表赋值——随机数StatusCreateList(LinkList&L,inti){
for(intn=1;i>=n;i--) {
ListInsert(L,1,rand());
    }
returnOk;
}
//输出链表的每个结点voidput(LinkList&L){
LNode*p;        //定义一个LNode类型的指针Pinti=1;
p=L->next;     //p指向第一个结点,跳过头结点(头结点不存数据),while(p){         //遍历输出cout<<p->data<<":"<<i<<"\t";
p=p->next;     //修改pi++;
    }
cout<<"\n";
}
//主函数intmain(){
inte,n,a,b;
LinkListL;             //定义头结点L当作列表InitList(L);        //创建头结点Lcout<<"输入要随机创建的列表大小(>0):\n";
cin>>n;
CreateList(L,n);    //为链表L随机赋值cout<<"链表:"<<"\n" ;
put(L);                 //输出链表的各个结点cout<<"输入要插入的位置:\n";
cin>>a;
cout<<"输入要插入的数据:\n";
cin>>b;
ListInsert(L,a,b);       //在链表L的第2个结点插入数据99cout<<"插入之后的链表:"<<"\n" ;
put(L);              //输出执行插入语句之后的链表Lcout<<"输入要删除的结点:\n";
cin>>a;
ListDelete(L,a);         //删除单链表L中第2个结点cout<<"删除之后的列表:"<<"\n" ;
put(L);             //输出删除之后的链表cout<<"输入要获取数据的结点:\n";
cin>>a;
GetElem(L,a,e);         //获取单链表L中第2个结点存的数据给ecout<<"L链表第"<<a<<"个结点的数据为:"<<e<<"\n" ;
cout<<e;          //输出ereturn0;
}

6、实例结果

20201102201853782.png


目录
相关文章
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9
|
20天前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
2月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
766 6
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
81 4
|
3月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
149 16
|
3月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
209 8
|
4月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
72 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
3月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
163 4
|
3月前
|
存储 C语言
【数据结构】顺序表(c语言实现)(附源码)
本文介绍了线性表和顺序表的基本概念及其实现。线性表是一种有限序列,常见的线性表有顺序表、链表、栈、队列等。顺序表是一种基于连续内存地址存储数据的数据结构,其底层逻辑是数组。文章详细讲解了静态顺序表和动态顺序表的区别,并重点介绍了动态顺序表的实现,包括初始化、销毁、打印、增删查改等操作。最后,文章总结了顺序表的时间复杂度和局限性,并预告了后续关于链表的内容。
110 3

热门文章

最新文章