回 帖 发 新 帖 刷新版面

主题:求链表结构逐句解释

超级菜鸟求助:下面是源程序,包括定义,初始化,清空,求长度等操作,但我查阅了无数资料还是看不懂,希望高人把每条语句的注释加上方便一下我们这些初学者吧。谢谢了!
#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();  //
}

回复列表 (共2个回复)

沙发


你也许现在还没有学到这里。。。。。。
要慢慢来,不要太急功近利

板凳

[center]typedef lnode *linklist;  //这句不懂[/center]

指的是定义一个lnode类型下的类;

[u]linklist init(linklist l)  //初始化链表,形参是linklist l 怎么解释?[/u]

传的参数形式要和函数前边的类型一致 这里为linklist类型

[u]{ if (l->next==NULL)  return(1);  //[/u]
实际这函数是判断链表是否为空 为空时返回1 否则为0
顺序往下是求表的长度 插入结点 删除结点 删除链表 顺序逆序输出链表 正常输出链表
在某个位置插入某个值 就这几个函数 你慢慢看 然后多实践 不难的

我来回复

您尚未登录,请登录后再回复。点此登录或注册