数据结构(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语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
1120 6
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
110 5
|
5月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
90 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
4月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
214 4
|
6月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
5月前
|
存储
[数据结构] -- 单链表
[数据结构] -- 单链表
39 1
|
5月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
5月前
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
48 0
|
5月前
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
41 1
|
5月前
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
68 1