使用链表结构一次只需要一个结构体的连续空间.ppt
上传人:天马****23 上传时间:2024-09-11 格式:PPT 页数:22 大小:283KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

使用链表结构一次只需要一个结构体的连续空间.ppt

使用链表结构一次只需要一个结构体的连续空间.ppt

预览

免费试读已结束,剩余 12 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

处理一个班的学生,一般使用结构体数组,需预留足够大的数组空间studentstu[10]={{10101,"LiNin",18,'M',88},{...},{...},......};student*p;(环节)(节点)结构体优点:解决了上述两个问题1.需要多少结构体,就动态申请多少个结构体空间,比数组实现节约空间。2.每个结点未必连续存放,通过指针将各个结点连接起来,这样对大片连续存储区的要求降低。3.另外,对链表的操作如插入、删除等,也变得比较简单了。(不需要挪动数组元素空间了)①创建链表(有序链表、无序链表)②遍历链表(依次访问链表的每一个结点)查找结点,释放链表各节点的空间③删除结点④插入结点[例]动态申请,建立链表,输出各结点数据,最后循环依次释放各结点空间。#include<iostream.h>structnode{intdata;node*next;};voidmain(){node*head,*p1,*p2;head=newnode;p1=newnode;p2=newnode;head->data=1000;head->next=p1;p1->data=1001;p1->next=p2;p2->data=1002;p2->next=NULL;while(head!=NULL){cout<<head->data<<endl;p1=head;head=head->next;deletep1;}}1.创建无序链表:循环输入数据,若数值不为-1,新建一结点并连接到链表尾部。node*Create()//返回值:链表的首指针{node*p1,*p2,*head;inta;head=NULL;cout<<"正在创建一条无序链表...\n";cout<<"请输入一个整数,以-1结束:";cin>>a;while(a!=-1)//循环输入数据,建立链表{p1=newnode;p1->data=a;if(head==0)//①建立首结点{head=p1;p2=p1;}else//②处理中间结点{p2->next=p1;p2=p1;}cout<<"请输入一个整数,以-1结束:";cin>>a;}if(head!=0)p2->next=0;//③处理尾结点,可能第1次就输入-1return(head);//返回创建链表的首指针}2024/9/152024/9/152.遍历链表(输出链表上各个结点的值)2.遍历链表(续)(查找结点)3.删除一个结点删除链表上具有指定值的第一个结点首先要用遍历的思想查找该值的结点是否在单链表存在一定要有一个指向待删除结点前趋结点位置的指针(p2)以便删除//函数功能:删除第1个值为num的结点,返回新链表的首指针。node*Delete_one_node(node*head,intnum){node*p1,*p2;if(head==NULL)//链表为空,处理情况①{cout<<"链表为空,无结点可删!\n";return(NULL);}p1=head;while(p1->data!=num&&p1->next!=NULL){//循环查找待删除结点p2=p1;p1=p1->next;//p2指向的结点在p1指向的结点之前}if(p1->data==num)//找到待删除结点,由p1指向{if(p1==head)//若找到的结点是首结点,处理情况②head=p1->next;else//找到的结点不是首结点,处理情况③p2->next=p1->next;deletep1;cout<<"删除了一个结点!\n";}else//未找到待删除结点cout<<num<<"链表上没有找到要删除的结点!\n";return(head);}4.释放链表5.插入结点把一个结点插入链表,使链表结点数据保持升序//函数功能:将p指向的结点插入链表,结果链表保持有序。返回值是新链表的首指针。node*Insert(node*head,node*p)//{node*p1,*p2;if(head==NULL)//原链表为空链表,对应情况①{head=p;p->next=NULL;return(head);}p1=head;while((p->data)>(p1->data)&&p1->next!=NULL){//寻找待插入位置p2=p1;p1=p1->next;//p2指向的结点在p1指向的结点之前}if((p->data)<=(p1->data))//插在p1之前{p->next