动态链表详细讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
链表我自我感觉是真的很好的.对于c语言的一些不同类型的数据是很方便处理的.它就像一个容器.容纳着多种类型的数据.至于这个我就不说什么了.只说说我们今天的主题是链表的建立,删除和添加.至于静态链表我就不说了.这个比较简单.动态的还是有点绕.我也是在网上找了半天找不到什么好的自己想要的效果.就自己写了一段程序.我把该标记的都标记了.我相信你看了会有大的收获的.
/*头文件所需要的库文件*/
#include "iostream"
#include "stdlib.h"
#include "stdio.h"
#include "iomanip"
#define LEN sizeof(struct student)
using namespace std;
void input();
struct student
{
int number;
float price;
struct student *next;
};
int n=0; //全局变量定义节点数
/* 创建链表总共有三个结构体指针
分别是*head,(头指针标记)*p1(动态产生内存空间指针),
*p2(当前链表的指针最后一个节点)*/
struct student * creat()
{
struct student *head,*p1,*p2;
head=NULL; //head返回是void*类型
p1=p2=(struct student*)malloc(LEN); //p1 p2指向同一块内存空间即你申请的那个空间
input(); //input函数接受输入界面
cin>>p1->number>>p1->price; //在申请的里边输入数据
while(p1->number!=0) //结束标记符数字0作为输入结束的标记
{
n=n+1; //n计数器记录你输入记录的个数
if(n==1) //第一个节点
head=p1; //如果是第一个节点那么就直接将其内容写进去
else
p2->next=p1; //否则即不是第一个节点,那么将指针p1赋值p2->next
p2=p1; //p2移动到当前位置
p1=(struct student*)malloc(LEN); //重新为p1申请空间
cout< cin>>p1->number>>p1->price; //继续输入看是不是输入结束标记0了 } p2->next=NULL; //如果输入结束可以将本链表的指针域即p2所在位置赋值为空。 return (head); } /*下边是打印部分由于上边创建部分返回的是head结构体指针,他是你生成链表的头 所以在打印时他应该作为参数,所以在打印中有一个指针。他的作用大家也可以猜到 了吧就是接受你的参数*/ void show(struct student *head) { struct student *p; p=head; //将参数结构体指针head给另一个结构体指针p if(head!=NULL) //如果为空head是空指针即不指向任何地方所以此处不能写成head->next;无意义 { cout< cout< while(p!=NULL) //因为如果为空head是空指针所以想对应的p也是空指针即不指向任何地方 { cout< p=p->next; //顺序移动指针 } } else //否则和上边的if对应链表为空的情况 cout< } /*添加指针函数中参数是(你建立的head和你新建的stu)*/ struct student *addorder(struct student *head , struct student *stu) { /*总共有三个结构体指针 指针p1作为头指针的作用在函数总作用 指针p2作为你生成的添加的指针*/ struct student *p1,*p2; p1=head; p2=stu; if(p1!=NULL) //即添加的链表在添加之前不是空指针 { while(p1->next!=NULL) //开始寻找知道你寻找到他的指针域为空{ p1=p1->next; //指针p1寻找自己的指针域中存储地址地方 } n=n+1; p1->next=p2; //将你产生的节点指针p2接到p2后边 p2->next=NULL; } else //添加之前是空 { n=n+1; cout< head=p2; //把你产生的节点给了head p2->next=NULL; } return (head); } /*删除节点有两个参数一个数指针head另一个是你要删除的标志num 还是有两个指针*/ struct student *del(struct student *head,intnum) { struct student *p1,*p2; //指针p2指向找到的前一个指针p1=head;