回 帖 发 新 帖 刷新版面

主题:[讨论]我实在是不懂啊!

大家看到这么长一个程序不要烦啊,这个程序的算法很简单的,请耐心看下去,我实在不知道为什么要是这样的,这个程序没有任何错误,你们可以用TC试下,主要是这里我不太懂
typedef struct LNODE LNode;
typedef struct LNODE *LinkList;

int init(LinkList *L)
{
  *L=(LNode *)malloc(sizeof(LNode));
  if(!L)   exit(ERROR);
  (*L)->next=NULL;
  return OK;
}/*init */
为什么这里的L前面要这个*,我感觉这个完全可以不要的,我把它删了之后,其他的部分地方也要稍微修改下,程序仍然可以编译和运行,但是结果就不对了,为什么呢,上面初始化一个链表为什么要这样呢,这样不行吗?
LinkList init(LinkList L)
{
  L=(LinkList)malloc(sizeof(LNode));
  if(!L)   exit(ERROR);
  L->next=NULL;
  return OK;
}/*init */


以下为原始程序:
#include<stdio.h>
#include<malloc.h>
#include<conio.h>

#define ERROR 0
#define OK 1
#define EQUAL 1
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

struct STU{
  char name[20];
  char stuno[10];
  int age;
  int score;
}stu[50];
typedef struct STU ElemType;

struct LNODE
{
  ElemType data;
  struct LNODE *next;
};

typedef struct LNODE LNode;
typedef struct LNODE *LinkList;


int init(LinkList *L)
{
  *L=(LNode *)malloc(sizeof(LNode));
  if(!L)   exit(ERROR);
  (*L)->next=NULL;
  return OK;
}/*init */

int ListLength(LinkList L)
{
  int j=0;
  while (L->next)
    {
      L=L->next;
      j++;
    }
  return j;
}

int GetElem(LinkList L,int i,ElemType *e)
{
  LinkList p; int j;
  p=L->next;j=1;
  while(p&&j<i){
    p=p->next;++j;
  }
  if(!p||j>1)  return ERROR;
  *e=p->data;
  return OK;
}

int EqualList(ElemType *e1,ElemType *e2)
{
  if (strcmp(e1->name,e2->name)==0)
    return 1;
  else
    return 0;
}

int Less_EqualList(ElemType *e1,ElemType *e2)
{
  if (strcmp(e1->name,e2->name)<=0)
    return 1;
  else
    return 0;
}
int LocateElem(LinkList La,ElemType e,int type)
{
  int i;
  LinkList p;
  p=La;
  switch (type)
    {
      case EQUAL:
      while(p->next)
        {
          p=p->next;
          if(EqualList(&p->data,&e))
           return 1;
        }
      return 0;
    break;
      default:
    break;
    }
  return 0;
}

void MergeList(LinkList La,LinkList Lb,LinkList *Lc)
{
  LinkList pa,pb,pc;
  pa=La->next;pb=Lb->next;
  *Lc=pc=La;
  while(pa && pb)
    {
      if(Less_EqualList(&pa->data,&pb->data))
    {
      pc->next=pa;pc=pa;pa=pa->next;
    }
      else
    {
      pc->next=pb;pc=pb;pb=pb->next;
    }
    }
  pc->next=pa?pa:pb;
  free(Lb);
}

int printlist(LinkList L)
{
  int i;
  LinkList p;
  p=L;
  printf("name       stuno        age     score\n");
  while(p->next)
    {
      p=p->next;
      printf("%-10s %s\t%d\t%d\n",  p->data.name,  p->data.stuno,
      p->data.age,  p->data.score);
    }
  printf("\n");
}

int ListInsert(LinkList L,int i,ElemType e)
{
  LinkList p,s;
  int j;
  p=L;j=0;
  while(p&&j<i-1)
    {
      p=p->next;
      ++j;
    }
  if(!p||j>i-1) return ERROR;
  s=(LinkList)malloc(sizeof(LNode));
  s->data=e;
  s->next=p->next;
  p->next=s;
  return OK;
}/*ListInsert Before i */


main()
{
  struct STU e;
  LinkList La,Lb,Lc;

  clrscr();

  printf("\n\n-------------------List Demo is running...----------------\n\n");
  printf("First is InsertList function.\n");
  init(&La);

  strcpy(e.name,"stu1");
  strcpy(e.stuno,"100001");
  e.age=80;
  e.score=1000;
  ListInsert(La,1,e);
  strcpy(e.name,"stu3");
  strcpy(e.stuno,"100002");
  e.age=80;
  e.score=1000;
  ListInsert(La,2,e);

  printlist(La);
  getch();

  strcpy(e.name,"stu5");
  strcpy(e.stuno,"100003");
  e.age=80;
  e.score=1000;
  ListInsert(La,3,e);

  printlist(La);
  getch();

  init(&Lb);

  strcpy(e.name,"stu2");
  strcpy(e.stuno,"100001");
  e.age=80;
  e.score=1000;
  ListInsert(Lb,1,e);
  strcpy(e.name,"stu4");
  strcpy(e.stuno,"100002");
  e.age=80;
  e.score=1000;
  ListInsert(Lb,2,e);

  strcpy(e.name,"stu6");
  strcpy(e.stuno,"100001");
  e.age=80;
  e.score=1000;
  ListInsert(Lb,3,e);

  printlist(Lb);
  getch();

  MergeList(La,Lb,&Lc);
  printlist(Lc);
  getch();

  printf("\n\n\n\n\n\nWelcome to visit http://zmofun.heha.net !\n\n\n\n\n\n\n");

}

回复列表 (共3个回复)

沙发

注意init()是要初始化链表,初始化的结果是从参数传出的,C语言里都是传值,所以需要借助指针。

如果不加*
int init(LinkList L)
{
  L=(LNode *)malloc(sizeof(LNode));
  if(!L)   exit(ERROR);
  L->next=NULL;
  return OK;
}/*init */
像这样,那么L就是局部变量,在return OK;的时候就会退出堆栈,所以函数中用malloc得到的地址将丢弃而再找不回来。

板凳

这点我也有点疑问 可以讲明白一点吗  老大

3 楼

但是在数据结构中线形表和单链表中 引用型不要加*  加工型加* 一般是可以成立的

我来回复

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