主题:求链表结构逐句解释
超级菜鸟求助:下面是源程序,包括定义,初始化,清空,求长度等操作,但我查阅了无数资料还是看不懂,希望高人把每条语句的注释加上方便一下我们这些初学者吧。谢谢了!
#include "stdio.h"
#include "conio.h"
#include "malloc.h"
typedef char elemtype; //给char定义别名
typedef struct node //定义node结构体
{ elemtype data; //等于char data;
struct node *next; //定义*next指针
}lnode; //定义一个结构体变量node,并且给 struct node定义了别名:lnode
typedef lnode *linklist; //这句不懂
linklist init(linklist l) //初始化链表,形参是linklist l 怎么解释?
{
l=(linklist)malloc(sizeof(lnode)); //分配lnode长度的内存空间,并使l指向它的地址
if(!l) printf("分配内存出错!"); //如果l=0
else l->next=NULL; //否则l->next=空
return(l); //返回l,
}
int empty(linklist l) //清空链表
{ if (l->next==NULL) return(1); //
else return(0); //
}
int length(linklist l) //
{ linklist p=l->next; //
int len=0; //
while(p) //
{
p=p->next; //
len++;}; //
return(len); //
}
lnode getnode(linklist l,int pos) //
{
lnode e; //
linklist p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)) exit(1); //
while(p&&cur_pos<pos) //
{p=p->next; //
cur_pos++;}; //
e=*p; //
return(e); //
}
void delnode(linklist l,int pos) //
{
linklist p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)) exit(1); //
while(p&&cur_pos<pos-1) //
{p=p->next; //
cur_pos++;}; //
p->next=p->next->next; //
}
void clearlist(linklist l) //
{
linklist p=l->next; //
while(p) //
{l->next=p->next; //
free(p); //
p=l->next; }; //
}
void destorylist(linklist l) //
{
linklist p=l; //
while(p) //
{ l=p->next; //
free(p); //
p=l;}; //
}
lnode prior(linklist l,int pos) //
{
return(getnode(l,pos-1)); //
}
lnode next(linklist l,int pos) //
{
return(getnode(l,pos+1)); //
}
void print(linklist l) //
{
linklist p=l->next; //
while(p) //
{ printf("%c",p->data); //
p=p->next;}; //
printf("\n"); //
}
void insert(linklist l,int pos,elemtype x) //
{
linklist s,p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)+1) {printf("插入位置有错!");getch();exit(1); }; //
while(p&&cur_pos<pos-1) //
{p=p->next; //
cur_pos++;}; //
s=(linklist)malloc(sizeof(lnode)); //
s->data=x; //
s->next=p->next; //
p->next=s; //
}
main()
{
linklist l; //
char ch,x; //
int pos,pos1,pos2,i=1; //
l=init(l); //
printf("***************************链表演示程序********************\n");
printf("请输入用来建立链表的字符,输入?表示输入完毕:\n");
ch=getchar(); //
while(ch!='?') //
{ insert(l,i,ch); //
ch=getchar(); //
i++; //
};
printf("**********************您建立的链表为:");
print(l); //
printf("**********************判断此链表是否非空:");
if(empty(l)) printf("空!\n"); //
else printf("非空!\n"); //
printf("**********************您输入的链表长度为:%d",length(l)); //
printf("\n"); //
printf("*********请输入你想取得的元素位置(1=<位置<=%d):",length(l)); //
scanf("%d",&pos); //
printf("第%d个元素为%c\n",pos,getnode(l,pos).data); //
fflush(stdin); //
printf("*******请输入需要插入的元素以及位置,输入时用逗号隔开:"); //
scanf("%c,%d",&x,&pos1); //
insert(l,pos1,x); //
printf("*************插入后新的链表如下:"); //
print(l); //
printf("**********************请输入你想删除的元素位置:"); //
fflush(stdin); //
scanf("%d",&pos2); //
delnode(l,pos2); //
printf("**********************删除后新的链表如下:"); //
print(l); //
printf("****欢迎您和菜鸟一起共同进步,QQ558064!*****");
getch(); //
}
#include "stdio.h"
#include "conio.h"
#include "malloc.h"
typedef char elemtype; //给char定义别名
typedef struct node //定义node结构体
{ elemtype data; //等于char data;
struct node *next; //定义*next指针
}lnode; //定义一个结构体变量node,并且给 struct node定义了别名:lnode
typedef lnode *linklist; //这句不懂
linklist init(linklist l) //初始化链表,形参是linklist l 怎么解释?
{
l=(linklist)malloc(sizeof(lnode)); //分配lnode长度的内存空间,并使l指向它的地址
if(!l) printf("分配内存出错!"); //如果l=0
else l->next=NULL; //否则l->next=空
return(l); //返回l,
}
int empty(linklist l) //清空链表
{ if (l->next==NULL) return(1); //
else return(0); //
}
int length(linklist l) //
{ linklist p=l->next; //
int len=0; //
while(p) //
{
p=p->next; //
len++;}; //
return(len); //
}
lnode getnode(linklist l,int pos) //
{
lnode e; //
linklist p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)) exit(1); //
while(p&&cur_pos<pos) //
{p=p->next; //
cur_pos++;}; //
e=*p; //
return(e); //
}
void delnode(linklist l,int pos) //
{
linklist p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)) exit(1); //
while(p&&cur_pos<pos-1) //
{p=p->next; //
cur_pos++;}; //
p->next=p->next->next; //
}
void clearlist(linklist l) //
{
linklist p=l->next; //
while(p) //
{l->next=p->next; //
free(p); //
p=l->next; }; //
}
void destorylist(linklist l) //
{
linklist p=l; //
while(p) //
{ l=p->next; //
free(p); //
p=l;}; //
}
lnode prior(linklist l,int pos) //
{
return(getnode(l,pos-1)); //
}
lnode next(linklist l,int pos) //
{
return(getnode(l,pos+1)); //
}
void print(linklist l) //
{
linklist p=l->next; //
while(p) //
{ printf("%c",p->data); //
p=p->next;}; //
printf("\n"); //
}
void insert(linklist l,int pos,elemtype x) //
{
linklist s,p=l; //
int cur_pos=0; //
if(pos<1||pos>length(l)+1) {printf("插入位置有错!");getch();exit(1); }; //
while(p&&cur_pos<pos-1) //
{p=p->next; //
cur_pos++;}; //
s=(linklist)malloc(sizeof(lnode)); //
s->data=x; //
s->next=p->next; //
p->next=s; //
}
main()
{
linklist l; //
char ch,x; //
int pos,pos1,pos2,i=1; //
l=init(l); //
printf("***************************链表演示程序********************\n");
printf("请输入用来建立链表的字符,输入?表示输入完毕:\n");
ch=getchar(); //
while(ch!='?') //
{ insert(l,i,ch); //
ch=getchar(); //
i++; //
};
printf("**********************您建立的链表为:");
print(l); //
printf("**********************判断此链表是否非空:");
if(empty(l)) printf("空!\n"); //
else printf("非空!\n"); //
printf("**********************您输入的链表长度为:%d",length(l)); //
printf("\n"); //
printf("*********请输入你想取得的元素位置(1=<位置<=%d):",length(l)); //
scanf("%d",&pos); //
printf("第%d个元素为%c\n",pos,getnode(l,pos).data); //
fflush(stdin); //
printf("*******请输入需要插入的元素以及位置,输入时用逗号隔开:"); //
scanf("%c,%d",&x,&pos1); //
insert(l,pos1,x); //
printf("*************插入后新的链表如下:"); //
print(l); //
printf("**********************请输入你想删除的元素位置:"); //
fflush(stdin); //
scanf("%d",&pos2); //
delnode(l,pos2); //
printf("**********************删除后新的链表如下:"); //
print(l); //
printf("****欢迎您和菜鸟一起共同进步,QQ558064!*****");
getch(); //
}