数据结构(C语言版)实现单链表的创建,赋值随机数,插入,删除,取值,输出
1、实现了...
实现了自定义创建链表的大小
实现了链表的随机赋值
实现了自定义插入,删除,取值
实现了输出链表的每个结点
2、什么是单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
3、样例
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、实例结果