站内搜索

数据结构教程 第十二课 实验二 循环链表实验

本课主题: 实验二 循环链表实验

教学目的: 掌握单向链表的实现方法

教学重点: 单向链表的存储表示及操作

教学难点: 单向链表的操作实现

授课内容:

一、单向链表的存储表示

C源程序

#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 10struct 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");}

 

二、单向链表的基本操作

C源程序

#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 10struct 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");}

  • 上一篇:数据结构教程 第十三课 队列
  • 下一篇:数据结构教程 第十一课 栈的应用