实验 线性表 实验目的 1.掌握用 Turbo C2.0上机调试线性表的基本方法。 2.掌握线性表基本操作,插入、删除、査找,以及线性表合并等运算 在顺序存储结构和连接存储结构上的运算 实验内容 1.线性表基本操作的实现 [问题描述]当我们要在线性表的顺序存储结构上的第i个位置上插入 一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位 置,以便腾空一个位置,再把新元素插入到该位置。若欲删除第i个元素时, 也必须把第i元素之后的所以元素前移一个位置 基本要求]要求生成线性表时,可以键盘上读取元素,用顺序存储结 构和连式存储结构实现存储。 [实现提示]要实现基本操作可用已实现的基本操作,也可设计简单的 算法实现 [算法实现] edef null 0. edef #define maxsize 1024 typedef struct i datatype data [maxsize] /*定义线性表是向量,第一接点是 data[o]=*/ int last I sequenlist /*插入函数*/ int insert(L,x,i)/*将新接点x插入到顺序表1第i个位置 sequenlist *L: /*1是 sequenlist类型的指针变量 I int if ((=1). last==maxsize-1) printf(“ overflow”); return null: 1 else if(i<1)||(i>(*1).1ast+1) error return null: 1 else
实验一 线性表 一. 实验目的 1. 掌握用 Turbo C 2.0 上机调试线性表的基本方法。 2. 掌握线性表基本操作,插入、删除、查找,以及线性表合并等运算 在顺序存储结构和连接存储结构上的运算。 二. 实验内容 1. 线性表基本操作的实现 [问题描述] 当我们要在线性表的顺序存储结构上的第 i 个位置上插入 一个元素时,必须先将线性表中第 i 个元素之后的所有元素依次后移一个位 置,以便腾空一个位置,再把新元素插入到该位置。若欲删除第 i 个元素时, 也必须把第 i 元素之后的所以元素前移一个位置。 [基本要求] 要求生成线性表时,可以键盘上读取元素,用顺序存储结 构和连式存储结构实现存储。 [实现提示] 要实现基本操作可用已实现的基本操作,也可设计简单的 算法实现 [算法实现] typedef null 0; typedef int datatype; #define maxsize 1024; typedef struct { datatype data[maxsize]; /*定义线性表是向量,第一接点是 data[0]*/ int last; }sequenlist; /*插入函数*/ int insert(L,x,i) /*将新接点 x 插入到顺序表 l 第 i 个位置 sequenlist *L; /*l 是 sequenlist 类型的指针变量 int i; { int j; if ((*l).last==maxsize-1) { printif(“overflow”); return null;} else if((i<1)||(i>(*l).last+1) { printf(“error”); return null;} else
i for(j=(*1). last; j>=1-1: j-) (*1).data[计+1](*1).data[j;/*接点后移 (*1).data[I-1]=x /*插入x (*1).1ast+1;} /*表长加一 return /*删除运算 int delete(L,i)/删除第i个接点 int if(i<1)|1(i>(料).last+1) printf(“ error”) return null: F I for (j=i; j<=(*L). last: j++) (=*1).data[j-1=(L). data] /*生成线性表 i sequentlist *L; printi“请输入n个数据n?) r(i=0,i<ni+); printf((data[%d=”,n) scanf("%d"&(*L)&data[iD) (L). last=n-1 printf("\n”) /*输出线性表 for(I=0; K<(L).last; i++)
{ for(j=(*l).last;j>=i-1;j--) (*l).data[j+1](*l).data[j]; /*接点后移 (*l).data[I-1]=x; /* 插入 x (*l).last+1; } /*表长加一 return (1); } /*删除运算 int delete(L,i)/*删除第 i 个接点 sequenlist *L; int i; { int j; if((i<1)||(i>(*L).last+1) { printf(“error”); return null; } else { for (j=i;j<=(*L).last;j++) (*l).data[j-1]=(*L).data[j]; (*L).last--; } return (1); } /*生成线性表 void ceatlist() { sequentlist *L; int n,I,j; printf(“请输入 n 个数据\n”); scanf(“%d”,&n); for(i=0,i<n,i+); { printf(“data[%d]=”,i); scanf(“%d”&(*L).&data[i]); } (*L).last=n-1; printf(“”\n”); } /*输出线性表 printout(L) sequenlist *L; { int i; for(I=0;i<(*L).last;i++)
printf( data[%d]=”,n) /*主程序开始 char cmd cisco printf("i 插入mn”) printf("d 删除n”) printf((“qQ退出n” }while(cmd!=d)川(cmdl=D)cmd!=q)川(cmd=Qcmd!=i )Il(cmd!=D); witch(cmd) i case i','I: scanf( &i) printout(L); break case‘d’,"D: scant(&n); (L); while(cmd!='q'll(cmd!=D); 2.约瑟夫问题 问题描述]设有n个人围坐一圈,先从某个人开始报数,数m到的人出 列,接着从出列的下一个开始重新报数,数到的M人又出列,一直下去直到 所有的人出列,试设计确定他们的出列次序序列的程序 [基本要求选择单向循环链表作为存储结构模拟过程,并依次输出出列 各人的编号。 实现提示]程序运行之后,首先要求用户初始报数的上限值,可以n<=30
{ printf(“data[%d]=”,i); printf(“%d”,(*L).data[i]); } } /*主程序开始 main() { sequenlist *L; char cmd’ int i,t; clscr(); printf(“i I 插入\n”); printf(“d D 删除\n”); printf(“q Q 退出\n”); do { do { do{cmd=getchar(); }while((cmd!=’d’)||(cmd!=’D’)||(cmd!=’q’)||(cmd!=’Q’)||(cmd!=’i ’)||(cmd!=I)); switch(cmd) { case ‘i’,’I’: scanf(&i); insert(L,i); printout(L); break; case ‘d’,’D’: scanf(&i); delete(L,i); printout(L); break; } }while((cmd!=’q’||(cmd!=’D’)); } 2.约瑟夫问题 [问题描述]设有 n 个人围坐一圈,先从某个人开始报数,数 m 到的人出 列,接着从出列的下一个开始重新报数,数到的 M 人又出列,一直下去直到 所有的人出列,试设计确定他们的出列次序序列的程序。 [基本要求]选择单向循环链表作为存储结构模拟过程,并依次输出出列 各人的编号。 [实现提示]程序运行之后,首先要求用户初始报数的上限值,可以 n<=30
此题中循环链表可不设头接点,而且必须清楚空表和非空表的界限。如: n=8m=4时,若从第一个人开始,设没各人的编号依次1、2、3、4..开始 报数,则得到的出列次序为48521376。 程序实现] struct struct node *next g linklist 建立连表 linklist *creat(head,n)/使n个人围成一圈,并给每个人标志号数 i linklist *s, *p; s=malloc(sizeof(linklist)) s->num=l for(i=2 i<=n; 1++) f(linklist)); S->num=I p return head linklist *select(head, m) linklist *head i linklist * p p=head; t=l /*q为p的前驱指针 p=q->next; /指向当前报数的人 t=t+1: f(ty
此题中循环链表可不设头接点,而且必须清楚空表和非空表的界限。如: n=8,m=4 时,若从第一个人开始,设没各人的编号依次 1、2、3、4…开始 报数,则得到的出列次序为 4 8 5 2 1 3 7 6。 [程序实现]: struct node { int num; struct node *next; } linklist; /*建立连表 linklist *creat(head,n)/使 n 个人围成一圈,并给每个人标志号数 linklist *head int n; { linklist *s, *p; int i; s=malloc(sizeof(linklist)); head=s; s->num=1; p=s; for(i=2;i<=n;i++); { s=malloc(sizeof(linklist)); s->num=i; p->next=s; p=s; } p->next=head; return head; } linklist *select(head,m) linklist *head; int m; { linklist *p , *q; int i, t; p=head;t=1; p=q; /*q 为 p 的前驱指针 do{ p=q->next; /*指向当前报数的人 t=t+1; if(t%m==0)
printf(%4d”p->num) q->nextp->next free(p); else i while(p==q) *主程序 ( int n,m linklist *head scanf(&n) scanf(&m) creat(head, n) elect(head, m) printf("the last one is%d", head-num) 思考题:用环形数组来实现 元多项式简单计算 [问题描述]设计一个一元多项式的简单计算器 基本要求]一元多项式的基本功能: (1)输入并建立多项式 (2)输出多项式 3)两个多项式相加减,相乘除,建立并输出多项式 [实现提示]可选择带头接点的单向循环链表或单项链表存储多项式,头 接点可以存储多项式的参数如项数等。 程序实现]这里利用单链表作为存储多项式的结构:单链表定义如下: fine null 0 struct ;/*系数 p;/*指数 struct mulpoly next; j
{ printf(“%4d”,p->num); q->next=p->next; free(p); p=q; } else p=q; } while(p==q); head=p; } /*主程序 main() { int n,m; linklist *head; scanf(&n); scanf(&m); creat(head,n); select(head,m); printf(“the last one:is%d”,head-num); } 思考题:用环形数组来实现 3. 一元多项式简单计算 [问题描述] 设计一个一元多项式的简单计算器 [基本要求]一元多项式的基本功能: (1) 输入并建立多项式 (2) 输出多项式 (3) 两个多项式相加减,相乘除,建立并输出多项式 [实现提示]可选择带头接点的单向循环链表或单项链表存储多项式,头 接点可以存储多项式的参数如项数等。 [程序实现]这里利用单链表作为存储多项式的结构:单链表定义如下: #define null 0 #define true 1 #define false 0 struct mulpoly { int coef ;/*系数 int exp; /*指数 struct mulpoly next; }