
头插法建立单链表的算法中有几个地方不太懂,请教(不懂得地方在代码后标记)
link*link::hcreat(intn){inti;p=NULL;//p是代表什么?for(i=1;i<=n;i++){s=newlink;cin>>s->data...
link *link::hcreat(int n)
{
int i;
p=NULL; //p是代表什么?
for(i=1;i<=n;i++)
{
s=new link;
cin>>s->data;
s->next=p;
p=s; //这句话何解?
}
return p; //为什么是输出p,而不是s?
} 展开
{
int i;
p=NULL; //p是代表什么?
for(i=1;i<=n;i++)
{
s=new link;
cin>>s->data;
s->next=p;
p=s; //这句话何解?
}
return p; //为什么是输出p,而不是s?
} 展开
展开全部
头插法建立单链表的意思就是每次从表头插入一个节点!这是思路!你得知道这个!
至于你得注释的问题:(1)p代表的是当前链表的第一个节点!刚开始链表为空!当然p=NULL了!(2)p=s何解。s是新建立的节点!把s赋给p就是让p重新指向s(这里的s是当前的第一个节点),这样p又一次指向了链表的第一个节点!以便进行下次循环!换句话说,每次循环p都要指向链表的第一个节点!而s是新建立的节点!是要在第一个节点前插入链表的!(因为是头插法嘛!)
(3)为什么输出p,其实s也一样!因为最后你不是把s赋给p了吗(这句p=s)所以这时p和s都指向链表的第一个节点!输出他!明白了吧?
至于你得注释的问题:(1)p代表的是当前链表的第一个节点!刚开始链表为空!当然p=NULL了!(2)p=s何解。s是新建立的节点!把s赋给p就是让p重新指向s(这里的s是当前的第一个节点),这样p又一次指向了链表的第一个节点!以便进行下次循环!换句话说,每次循环p都要指向链表的第一个节点!而s是新建立的节点!是要在第一个节点前插入链表的!(因为是头插法嘛!)
(3)为什么输出p,其实s也一样!因为最后你不是把s赋给p了吗(这句p=s)所以这时p和s都指向链表的第一个节点!输出他!明白了吧?

2025-08-05 广告
Paykka 的数字化流程涵盖了开户、收款、提现等全流程,从资料提交、账户开通到各种资金操作,都能在线上完成,无需用户进行线下干预,简化了操作步骤,提升了整体的操作效率。...
点击进入详情页
本回答由paykka提供
展开全部
不知道你这段程序哪来的,不过我估计这只是个算法,不是完整的程序,所以断断续续,你就没法看懂。我给你个完整的你去看吧!
线性链表的插入、删除和合并(源程序)
#include<iostream>
#include<malloc.h>
#define OK 1
#define ERROR 0
using namespace std;
//-----------------------
typedef struct lnode{
int date;
struct lnode *next;
}lnode,*linklist;
void creat_l(linklist &L,int n)
{
int i;
lnode *p;
L=(linklist)malloc(sizeof(lnode));
L->next=NULL;
for(i=0;i<n;++i)
{
p=(linklist)malloc(sizeof(lnode));
cin>>p->date;
p->next=L->next;
L->next=p;
}
}
void output( linklist &L)
{
lnode* p;
p=L->next;
while(p)
{
cout<<p->date<<"**";
p=p->next;
}
}
struct insert(linklist &L,int i,int e)
{
lnode *p,*s;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(linklist)malloc(sizeof(lnode));
s->date=e;
s->next=p->next;
p->next=s;
return OK;
}
struct delect(linklist &L,int j, int e)
{
lnode *p,*q;
int m=0;
p=L;
while(p->next&&m<j-1)
{
p=p->next;
++m;
}
if(!(p->next)||m>j-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->date;
free(q);
return OK;
}
void creat_emptyl(linklist &L)
{
L=(linklist)malloc(sizeof(lnode));
L->next=NULL;
}
void Mergelist_L(linklist &La,linklist &Lb,linklist &Lc)
{
lnode *pa,*pb,*pc;
pa=La->next;
pb=Lb->next;
pc=Lc;
while(pa&&pb)
{
if(pa->date<=pb->date)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
free(La);
}
void main()
{
linklist La,Lb,Lc;
int i,j,n,e;
cout<<"*******创建新链表*******"<<endl;
cout<<"请输入要创建的链表的长度n:"<<endl;
cin>>n;
cout<<"开始创建:"<<endl;
creat_l(La, n);
output( La);
cout<<endl;
cout<<"*******链表的插入*******"<<endl;
cout<<"请输入要插入的元素的位置i:"<<endl;
cin>>i;
cout<<"请输入要插入的元素e:"<<endl;
cin>>e;
insert(La, i, e);
output( La);
cout<<endl;
cout<<"*******链表的删除*******"<<endl;
cout<<"请输入要删除的元素的位置j:"<<endl;
cin>>j;
delect(La, j, e);
output(La);
cout<<endl;
cout<<"*******创建新链表*******"<<endl;
cout<<"请输入要创建的链表的长度n:"<<endl;
cin>>n;
cout<<"开始创建:"<<endl;
creat_l(Lb, n);
output( Lb);
cout<<endl;
cout<<"创建空链表"<<endl;
creat_emptyl(Lc);
cout<<endl;
cout<<"*******合并链表*******"<<endl;
Mergelist_L(La,Lb,Lc);
output( Lc);
cout<<endl;
}
线性链表的插入、删除和合并(源程序)
#include<iostream>
#include<malloc.h>
#define OK 1
#define ERROR 0
using namespace std;
//-----------------------
typedef struct lnode{
int date;
struct lnode *next;
}lnode,*linklist;
void creat_l(linklist &L,int n)
{
int i;
lnode *p;
L=(linklist)malloc(sizeof(lnode));
L->next=NULL;
for(i=0;i<n;++i)
{
p=(linklist)malloc(sizeof(lnode));
cin>>p->date;
p->next=L->next;
L->next=p;
}
}
void output( linklist &L)
{
lnode* p;
p=L->next;
while(p)
{
cout<<p->date<<"**";
p=p->next;
}
}
struct insert(linklist &L,int i,int e)
{
lnode *p,*s;
int j=0;
p=L;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
return ERROR;
s=(linklist)malloc(sizeof(lnode));
s->date=e;
s->next=p->next;
p->next=s;
return OK;
}
struct delect(linklist &L,int j, int e)
{
lnode *p,*q;
int m=0;
p=L;
while(p->next&&m<j-1)
{
p=p->next;
++m;
}
if(!(p->next)||m>j-1)
return ERROR;
q=p->next;
p->next=q->next;
e=q->date;
free(q);
return OK;
}
void creat_emptyl(linklist &L)
{
L=(linklist)malloc(sizeof(lnode));
L->next=NULL;
}
void Mergelist_L(linklist &La,linklist &Lb,linklist &Lc)
{
lnode *pa,*pb,*pc;
pa=La->next;
pb=Lb->next;
pc=Lc;
while(pa&&pb)
{
if(pa->date<=pb->date)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(Lb);
free(La);
}
void main()
{
linklist La,Lb,Lc;
int i,j,n,e;
cout<<"*******创建新链表*******"<<endl;
cout<<"请输入要创建的链表的长度n:"<<endl;
cin>>n;
cout<<"开始创建:"<<endl;
creat_l(La, n);
output( La);
cout<<endl;
cout<<"*******链表的插入*******"<<endl;
cout<<"请输入要插入的元素的位置i:"<<endl;
cin>>i;
cout<<"请输入要插入的元素e:"<<endl;
cin>>e;
insert(La, i, e);
output( La);
cout<<endl;
cout<<"*******链表的删除*******"<<endl;
cout<<"请输入要删除的元素的位置j:"<<endl;
cin>>j;
delect(La, j, e);
output(La);
cout<<endl;
cout<<"*******创建新链表*******"<<endl;
cout<<"请输入要创建的链表的长度n:"<<endl;
cin>>n;
cout<<"开始创建:"<<endl;
creat_l(Lb, n);
output( Lb);
cout<<endl;
cout<<"创建空链表"<<endl;
creat_emptyl(Lc);
cout<<endl;
cout<<"*******合并链表*******"<<endl;
Mergelist_L(La,Lb,Lc);
output( Lc);
cout<<endl;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询