动态链表详细讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<number<<"成绩"<price<

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;

相关文档
最新文档