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

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

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

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

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

授课内容:

一、单向链表的存储表示

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 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");

}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, strcpy
, return
, next
, name
, 114la
, LinkList
, 单向循环链表
strcpy()
循环链表、双向循环链表、单循环链表、c 循环链表、java 循环链表,以便于您获取更多的相关知识。

时间: 2024-10-28 23:54:48

数据结构教程 第十二课 实验二 循环链表实验的相关文章

数据结构教程 第十九课 实验四 串的实现实验

教学目的: 掌握PASCAL串类型的实现方法 教学重点: 串的操作 教学难点: 串的联接操作 授课内容: 一.PASCAL串类型的存储表示: #define MAXSTRLEN 255 typedef char SString[MAXSTRLEN+1]; 二.串的操作: 1.串的联接 mystrcat(SString s1,SString s2,SString t); 2.求子串 mysubstr(SString t,int pos,int len,SString sub); 3.子串定位 my

数据结构教程 第二十五课 单元测验

教学目的: 复习前面所学的内容,检验学习效果,拾遗补缺 教学重点: 教学难点: 授课内容: 测验题: 一,填空: 基本数据结构有____,____,____,____四种. 存储结构可根据数据元素在机器中的位置是否连续分为____,____. 算法的基本要求有_____,_____,____,____. 度量算法效率可通过_______,_______两方面进行. 栈的定义:_______________________. 二,简答: 举例说明数据对象.数据元素.数据项的定义. 类C语言和C语言

数据结构教程 第二十六课 图的定义与术语

教学目的: 掌握图的定义及常用术语 教学重点: 图的常用术语 教学难点: 图的常用术语 授课内容: 一.图的定义 图是一种数据元素间为多对多关系的数据结构,加上一组基本操作构成的抽象数据类型. ADT Graph{ 数据对象V :V是具有相同特性的数据元素的集合,称为顶点集. 数据关系R: R={VR} VR={<v,w>|v,w(-V且P(v,w),<v,w>表示从v到w的弧,谓词P(v,w)定义了弧<v,w>的意义或信息} 基本操作P: CreateGraph(&a

数据结构教程 第二十四课 遍历二叉树

教学目的: 掌握二叉树遍历的三种方法 教学重点: 二叉树的遍历算法 教学难点: 中序与后序遍历的非递归算法 授课内容: 一.复习二叉树的定义 二叉树由三个基本单元组成:根结点.左子树.右子树 问题:如何不重复地访问二叉树中每一个结点? 二.遍历二叉树的三种方法: 先序 1 访问根结点 2 先序访问左子树 3 先序访问右子树 中序 1 中序访问左子树 2 中序访问根结点 3 中序访问右子树 后序 1 后序访问左子树 2 后序访问右子树 3 访问根结点 三.递归法遍历二叉树 先序: Status(P

数据结构教程 第二十八课 图的存储结构

教学目的: 掌握图的二种存储表示方法 教学重点: 图的数组表示及邻接表表示法 教学难点: 邻接表表示法 授课内容: 一.数组表示法 用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息. // 图的数组(邻接矩阵)存储表示 #define INFINITY INT_MAX //最大值无穷大 #define MAX_VERTEX_NUM 20 //最大顶点个数 typedef enum{DG,DN,AG,AN} GraphKind;//有向图,有向网,无向图,无向网 typ

数据结构教程 第二十九课 静态查找表(一)顺序表的查找

教学目的: 掌握查找的基本概念,顺序表查找的性能分析 教学重点: 查找的基本概念 教学难点: 顺序表查找的性能分析 授课内容: 一.查找的基本概念 查找表: 是由同一类型的数据元素(或记录)构成的集合. 查找表的操作: 1.查询某个"特定的"数据元素是否在查找表中.2.检索某个"特定的"数据元素的各种属性.3.在查找表中插入一个数据元素:4.从查找表中刪去某个数据元素. 静态查找表 对查找表只作前两种操作 动态查找表 在查找过程中查找表元素集合动态改变 关键字 是数

数据结构教程 第十四课 串的定义

教学目的: 掌握串的定义及作用 教学重点: 串的类型定义 教学难点: 串的类型定义 授课内容: 一.串定义 串(或字符串),是由零个或多个字符组成的有限序列.一般记为: s='a1a2...an'(n>=0) 其中s是串的名,用单引号括起来的字符序列是串的值:串中字符的数目n称为串的长度.零个字符的串称为空串,它的长度为零. 串中任意个连续的字符组成的子序列称为该串的子串.包含子串的串相应地称为主串.通常称字符在序列中的称为该字符在串中的位置.子串在主串中的位置则以子串的第一个字符在主串中的位置

数据结构教程 第十五课 串的表示和实现

教学目的: 掌握串的几种实现方法 教学重点: 定长顺序存储表示法 堆分配存储表示法 教学难点: 堆分配存储表示法 授课内容: 一.复习串的定义 串的定义 二.定长顺序存储表示 类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列. #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1] //0号单元存放串长 串的实际长度可在这予定义长度的范围内随意,超过予定义长度的串值则被舍去 串长可用下标为0的数组元素

数据结构教程 第十六课 串操作应用举例

教学目的: 掌握文本编辑的基本原理及方法 教学重点: 简单文本编辑 教学难点: 串的存储管理 授课内容: 一.复习串的堆分配存储表示 堆分配存储表示 二.文本编辑基本原理 图一 文本编辑可以用于源程序的输入和修改(如图一),也可用于报刊和书籍的编辑排版以及办公室的公文书信的起草和润色(如图二). 图二 可用于文本编辑的程序很多,功能强弱差别很大,但基本操作是一致的:都包括串的查找,插入和删除等基本操作. 对用户来讲,一个文本(文件)可以包括若干页,每页包括若干行,每行包括若干文字. 对文本编辑程

数据结构教程 第十八课 数组的顺序表示与实现

教学目的: 掌握数组的定义,数组的顺序表示方法 教学重点: 数组的定义,数组的顺序表示方法 教学难点: 数组的顺序表示方法 授课内容: 一.数组的定义 几乎所有的程序设计语言都把数组类型设定为固有类型. 以抽象数据类型的形式讨论数组的定义和实现,可以让我们加深对数组类型的理解. 数组的定义: ADT Array{ 数据对象:ji=0,...,bi-1,i=1,2,...,n; D={aj1j2...jn|n(>0)称为数组的维数,bi是数组第i维的长度,ji是数组元素的第i维下标,aj1j2..