数据结构(Java版)线性表的实现与应用完整版

数据结构(Java版)线性表的实现与应用完整版
数据结构(Java版)线性表的实现与应用完整版

实验报告

课程名称数据结构

实验项目线性表的实现及应用

实验仪器PC机一台

学院_____

专业

班级/ 学号

姓名

实验日期

成绩

指导教师

北京信息科技大学

信息管理学院

(数据结构课程上机)实验报告

专业:班级:学号:姓名:成绩:

实验名称线性表的实现及应用实验地点实验时间

1.实验目的:

(1)理解用顺序表实现线性表的特点;熟练掌握顺序表的基本操作;学会利用顺序表解决实际应用问题。

(2)熟练掌握单链表的使用;理解用链表实现线性表的特点;了解链表的多种形式;学会利用单链表解决实际应用问题。

2.实验要求:

(1)学时为8学时;

(2)能在机器上正确、调试运行程序;

(3)本实验需提交实验报告;

(4)实验报告文件命名方法:数据结构实验_信管 16xx_学号 _姓名 .doc。

3.实验内容和步骤:

第一部分顺序表的实现与应用

(1)基于顺序表实现线性表的以下基本操作:

public interface LList

{ // 线性表接口,泛型参数 T 表示数据元素的数据类型

boolean isEmpty();//判断线性表是否空

int size();//返回线性表长度

T get(int i);//返回第 i(i ≥0)个元素

void set(int i, T x);//设置第 i 个元素值为 x

void insert(int i, T x);//插入 x 作为第 i 个元素

void insert(T x);//在线性表最后插入 x 元素

T remove(int i);//删除第 i 个元素并返回被删除对象

int search(T key); //查找,返回首次出现的关键字为 key 的元素的位序void removeAll();//删除线性表所有元素

public String toString();// 返回顺序表所有元素的描述字符串,形式为“(,)”

}

要求:实现后应编写代码段对每个基本操作做测试。

(2)顺序表的简单应用

a)运用基本操作编写算法删除第 i 个开始的 k 个元素。

b)编写高效算法删除第 i 个开始的 k 个元素。

c)将两个顺序表合并为一个顺序表(表中元素有序);

d)若两个元素按值递增有序排列的顺序表A和B,且同一表中的元素值各

不相同。试构造一个顺序表 C,其元素为 A 和 B 中元素的交集,且表

C中的元素也按值递增有序排列;

(3)利用顺序表解决约瑟夫环问题:已知n 个人(以编号 1,2,3...n 分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。要求:输出出列次序。

第二部分单链表的实现与应用

(4)基于单链表实现线性表的以下基本操作(不需要建立接口,直接建立带头

结点的单链表类):

ADT List

{boolean isEmpty();

int size();

T get(int i);

void set(int i, T x);

Node insert(int i, T x);

Node insert(T x);

T remove(int i);

void removeAll();

Node search(T key);//判断线性表是否空

// 返回线性表长度

// 返回第 i ( i≥0)个元素

//设置第 i 个元素值为 x

// 插入 x 作为第 i 个元素

//在线性表最后插入x 元素

//删除第 i 个元素并返回被删除对象//删除线性表所有元素

//查找,返回首次出现的关键字为key

元素

public String toString();//返回顺序表所有元素的描述字符串,形式为“(,)”

}

要求:实现后应编写代码段对每个基本操作做测试。

(5)实现单链表的子类排序单链表,覆盖单链表如下方法:

void set(int i, T x);

Node insert(int i, T x); Node insert(T x);//设置第 i 个元素值为 x

//插入 x 作为第 i 个元素

//在线性表最后插入x 元素

Node search(T key);//查找,返回首次出现的关键字为key 元素

(6)基于排序单链表实现线性表的以下综合应用:

e)删除第 i 个开始的 k 个元素。

f) 删除递增有序单链表中所有值大于mink 且小于 maxk 的元素。

g)将两个单链表合并为一个单链表,保持有序。

h)若两个元素按值递增有序排列的单链表 A 和 B,且同一表中的元素值各不相

同。试构造一个单链表 C,其元素为 A 和 B 中元素的交集,且表 C 中的元素

也按值递增有序排列。要求利用原有链表中的元素。

(7)一元多项式的基本运算

用排序单链表表示一元多项式,并实现以下基本运算:

一元多项式的建立

一元多项式的减法运算(要求:在运算过程中不能创建新结点即A=A-B)

(8)备份自己程序

4.实验准备:

复习教材第 2 章线性表的知识点

熟悉 Java编程环境

提前熟悉实验内容,设计相关算法

5.实验过程:第一部分:( 1)

package public ex1;

interface LList

{//线性表接口,泛型参数T 表示数据元素的数据类型

boolean isEmpty();//判断线性表是否空

int length();//返回线性表长度

T get(int i);// 返回第 i ( i ≥0)个元素void set( int i, T x);// 设置第 i 个元素值为 x

int insert(int i, T x);//插入x作为第i个元素

int append(T x);//在线性表最后插入x 元素

T remove(int i);//删除第i个元素并返回被删除对象void removeAll();//删除线性表所有元素

int search(T key);//查找,返回首次出现的关键字为key的元素的位序

}

类名:

public class SeqListimplements LList {

protected Object[]element;

protected int n ;

public SeqList(int length)//构造容量为length的空表

{

this. element= new Object[length];//申请数组的存储空间,元素为null。

//若

length<0

https://www.360docs.net/doc/715133894.html,ng.NegativeArraySizeException

this . n = 0;

, Java抛出负数组长度异常

}

public SeqList()//创建默认容量的

空表,构造方法重载

{

this(64);//调用本类已声明的指定参数列表的构造方法

}

public SeqList(T [] values)//构造顺序表,由values 数组提供元素,忽略其中空对象

{

this(values.length*2);//创建2倍values数组容量的空表

//若values==null,用空对象调用方法,Java抛出空对象异常NullPointerException

for ( int

组元素。 O(n)

i=0; i

this . element[ this. n ++]= values[i];//对象引用赋值}

public boolean isEmpty()// 判断线性表是否空

{

return this. n==0;

}

public

return int length(){

this . n ;

//返回线性表长度

}

public T get(int i){//返回第i ( i ≥0)个元素

if(i>=0 && i

return(T)this. element[i];// 返回数组元素引用的对象,传递对象引用

//return this.element[i];//编译错,Object对象不能返回T对象

return null;

}

public void set(int i, T x){//设置第i个元素值为x

if(x==

throw null )

new NullPointerException("x==null");//抛出空

对象异常

if (i>=0 && i

this . element[i] = x;

else throw new

https://www.360docs.net/doc/715133894.html,ng.IndexOutOfBoundsException(i+

}

"" ); //抛出序号越界异常public int insert(int i, T x){//插入x作为第i个元素

if(x== null

throw

)

new NullPointerException("x==null");//抛出空

对象异常

if(i<0)i=0;//插入位置i容

错,插入在最前

if (i>this Object[] source =. n) i=this

this

. n;

. element;

//插

入在最后

//数组

变量

引用赋值,source 也引用 element数组

if ( this . n== element . length)//若数组满,则扩充顺序表的数组容量

{

this. element= new Object[source.length*2];// 重新申请一个容量更大的数组

for( int j=0; j

this. element[j] = source[j];

}

for( int j=this. n-1; j>=i; j--)//从i开始至表尾的元素向后移动,次序从后向前

this . element [j+1] = source[j];

this . element[i] = x;

this . n ++;

return i;//返回x序号}

public int append(T x){//在线性表最后插入x 元素

return this.insert(this. n, x);

}

public T remove(int i){

//删除第i个元素并返回被删除对象

if( this. n>0 && i>=0 && i

{

T old = (T)this. element[i];//old中存储被删除元素

for( int j=i; j

this. element[j]= this . element[j+1];//元素前移一个位置

this. element[ this. n -1]=null;//设置数组元素对象为空,释放原引用实例

this. n--;

return old;//返回old局部变量引用的对象,传递对象引用

}

return null;

}

public void removeAll(){

//删除线性表所有元素

this . n=0;

}

public int search(T key){//查找,返回首次出现的关键

字为 key 的元素的位

System.out .print(this .getClass().getName()+".indexOf("+key+ ") , " );

for ( int i=0; i

{

if(key.equals(this. element[i]))//执行T类的 equals(Object)方法,运行时多态

return i;

}

return-1;

}

public String toString(){

String str=this.getClass().getName()+

if ( this . n>0)

str +=this . element [0].toString(); toString()方法,运行时多态"("

;

//返回类名

//执行T类的

for str +=( int i=1; i<

", "

this

+this

. n; i++) .

element[i].toString();//执行T类的

toString()方法,运行时多态

return str+") ";

}

public static void main (String args[])

{

SeqList list=new SeqList(20);

Integer values[]={10,1,2,3,4,5,6,7,8,9};

SeqList list1=new SeqList(values);

System.out.print(" 输出顺序表 :");

System.out.println(list1.toString());

System.out.println(" 顺序表 List是否为空

" +list.isEmpty()+",List1是否为空 " +list1.isEmpty());

System.out.println("list的长度" +list.length()+",list1的长度" +list1.length());

System.out.println(" 返回 list1的第 7 个元素是 :"+list1.get(6));

System.out.println(" 重新设置第5个元素为 19:" );

list1.set(4, 19);

list1.insert(2, 100);

list1.append(20);

System.out.println(" 删除 8:" +list1.remove(8));

System.out.print(" 修改后的顺序表 :");

System.out.println(list1.toString());

list1.removeAll();

System.out.println(" 删除后的顺序表: " +list1.toString()); // 为空

System.out.println(" 寻找元素 50:"+list1.search(50));

}

}

(2)

a)

package ex1;

public class Del {

public Del( int i,int k)

{

String values[]={"A" , "b" , "C" , "d" , "e" , "f" , "g" , "h" };

int n =values.length;

for ( int j=0;j

System. out .print(values[j]+" ");}

System. out .println();

for ( int j=i+k;j

values[j-k]=values[j];}

n=n-k;

for( int j=0;j

System. out .print(values[j]+

" ");}

System. out .println();

}

public static void main(String args[]){

new Del(2,3);

}

}

b)

package ex1;

public class Del2 {

public Del2( int i, int k){

String values[]={"A" , "x" , "y" , "y" , "b" , "c" , "h" };

SeqList list=new SeqList(values);

System.out .println(list.toString());

for ( int j=1;j<=k;j++)

{ list.remove(i);}

System.out .println(list.toString());

}

public static void main(String args[])

{

new Del2(2,3);

}

}

c)

package ex1;

public class

public

Merge { Merge(){

Integer values1[]={1,3,5,11};

SeqList list1=new SeqList(values1);

Integer values2[]={2,4,5,22,23};

SeqList list2=new SeqList(values2);

SeqList list3=new SeqList();

int i=0,j=0;

while (i

{

if (list1.get(i)

list3.append(list1.get(i));

i++;

}

else{

list3.append(list2.get(j));

j++;

}

}

while (i

list3.append(list1.get(i));

i++;

}

while (j

{

list3.append(list2.get(j)) ;

j++;

}

System.out .println(list1.toString());

System.out .println(list2.toString());

System.out .println(list3.toString());

}

public static void main(String args[]){

new Merge();

}

}

d)

package import public

test;

ex1.SeqList;

class Intersection {

public Intersection(){

Integer values1[]={1,3,5,11,12,13,22,23,50};

SeqListlist1= new SeqList(values1);

Integer values2[]={2,4,5,12,19,20,22,23,};

SeqListlist2= new SeqList(values2);

SeqListlist3= new SeqList();

int i =0, j =0;

while( i

{

if( list1.get(i )< list2.get(j )){

i ++;

}

else if( list1.get(i )> list2.get(j )){

j ++;

}

{

else

list3.append(list1.get(i ));

i++;

j ++;

}

}

System.out.println(list1.toString());

System.out.println(list2.toString());

System.out.println(list3.toString());

public static void main(String args[]) {

new Intersection();

}

}

3.

(1)

package ex1;

public class Josephus {

public Josephus(int n ,int k ,int m) {

System.out SeqList.println(

list

"Josephus("+ n+ "," +k + ","+m+") , " );

= new SeqList(n );

//创建顺序表实例,元素类型是数字字符,只能排到n=9,否

则达不到效果

for( int i =0;i

list.append((char)('1'+ i )+ "");//顺序表尾插入, O(1)

// System.out.println(list.toString());//输出顺序表的描述字符串,O(n)

int i =

while (元素时循环,计数O(1)

k ;

list.length()>1)

//计数起始位置

// 多于一个

{

i= (i + m-1) %list.length();//按循环方式对顺序表进行遍历, 圆桌循环

" );

System.

//删除i位置对象,

out

O(n)

.print(" 出列" + list.remove(i ).toString()+" ,// System.out.println(list.toString());

}

System.out .println(" 出列

" +list.get(0).toString());//get(0)获得元素,O(1)

public static void main(String args[])

{

new Josephus(9,1,3);

}

}

(2)

package test;

import ex1.SeqList;

public class JosephusA {

public JosephusA(int n , int k , int m)

{

System.out .println("Josephus("+n +"," +k+ ","+ m+ ") , " );

SeqListlist= new SeqList(n);

//创建顺序表实例,元素类型是数字字符,只能

排到n=9,否则达不到效果

for ( int i =0; i < n; i ++)

list.append( i );//顺序表尾插入,O(1)

// System.out.println(list.toString());//

输出顺序表的描述字符串,O(n)

int i = k;//计数起始位置

while ( list.length()>1)//多于一个元素时循环,计数O(1)

{

i = ( i +m-1) %list.length();//按循环方式

对顺序表进行遍历, 圆桌循环

System.out .print(" 出列

" +list.remove(i ).toString()+" , " );//删除i位置对象,O(n)

// System.out.println(list.toString());

" +list

}

System.

.get(0).toString());

}

out .println(

//get(0)

" 出列

获得元素, O(1)

public static void main(String args[]) {

new JosephusA(15,2,9);

}

}

第二部分:

( 4)、

package ex2;

public class Node {

public public T data ;

Nodenext ;

// 数据域

// 地址域,后继结点

//构造结点

public Node(T data,Node next){

this . data=data;

this . next =next;

}

//构造空结点

public Node(){

this ( null , null);

}

//描述字符串

public String toString(){

return this. data .toString();

}

}

package ex2;

public class SinglyList {

public Node head ;

//构造空单链表

public SinglyList()

{

head =new Node();

}

//构造单链表,由 values 数组数组提供元素

public SinglyList(T[] values)

{

this();

Noderear= this. head ;

for ( int i=0;i

{

;i++)

rear.next rear=rear.=new Node(values[i],

next ;

null);

}

}

public boolean isEmpty()// 判断线性表是否空

{

return this. head . next== null;

}

public T get(int i)// 返回第i ( i≥0)个元素

{

Nodep= head . next;

for ( int j=0;p!=null&&j

p=p. next ;

return (p!= null&&i>=0) ? p.data : null;

}

public void set(int i, T x)// 设置第i 个元素值为x

{

if(x== null)

throw new NullPointerException("x==null");// 抛出空对象异

Nodep= this . head . next ; //0

for ( int j=0;p!=null&&j

p=p. next ;

if (i>0&&p!= null )

p. data =x;

}

public int size()// 返回线性表长度

{

int i=0;

for (Nodep= this . head . next ;p!= null ;p=p. next )

i++;

return i;

}

public Node insert(int i, T x)// 插入 x 作为第 i 个元素{

if (x== null )

throw new NullPointerException("x=null");

Nodefront= this . head ;// 指定头结点

for ( int j=0;front.next != null&&j

front=front.next ;// 以此循环找

front. next =new Node(x,front.next);

return front.next ;

i-1

}

public Node insert(T x)

{ if (x== null )

throw new NullPointerException( Node front=this. head ;

for (; front.next != null;)

front = front.next ;

front.next = new Node(x,front.包括头插入、中间/ 尾插入

"x==null"

// 寻找第 i-1

next );

);// 抛出空对象异常

//front指向头结点

个或最后一个结点(front指向)

// 在 front之后插入值为x 结点,

return front.next ;

}

public T remove(int i)//删除第i个元素并返回被删除对象{

Nodep= this. head ;// 让 p指向头结点

for ( int j=0;j

p=p. next ;

if (p. next != null )

{

T old=p. next . data;

p. next =p. next . next ;

return old;

}

return null;

}

public void removeAll()// 删除线性表所有元素

{

this . head . next =null ;// 让头结点直接为空

}

public Node search(T key)// 查找,返回首次出现的关键字为key 元素{

for (Node p = this . head ;p. next != null ;p=p. next )

if ( key.equals(p.data ))

return p;

return null;

}

public String toString()// 返回顺序表所有元素的描述字符串,形式为“(,)”

{

String str=this .getClass().getName()+"(" ;// 返回类名

for (Node p= this . head . next ; p!= null ; p=p. next ) //p 遍历单链表{ str += p.data .toString();

if (p. next != null )

str+= "," ;// 不是最后一个结点时,

加分隔符

}

return str+ ")";

}

}

( 5)、

package ex2;

public class SortedSinglyList> extends SinglyList{

//构造空排序单链表

public SortedSinglyList()

{

super ();// 默认调用父类构造方法SinglyList() }

public SortedSinglyList(SinglyList list)

{

super ();

for(Node p=list.head . next ; p!=null ; p=p.

// 构造空单链表

next ) // 直接插入排序,

每趟插入 1 个元素

this.insert(p.data );// 排序单链表按值插入

}

//构造,将 values 数组中的所有对象按值插入

public SortedSinglyList(T values[])

{

super ();

for ( int

this

i=0;i

}

public void set(int i, T x)// 设置第i 个元素值为x

{

throw new UnsupportedOperationException("set(int i, T x)");// 不支持父类方法,覆盖并抛出异常

}

public Node insert(int i, T x)// 插入 x作为

i 个元素

{

throw new UnsupportedOperationException("set(int i, T x)"); // 不支持父类方法,覆盖并抛出异常

}

public Node insert(T x)// 在线性表最后插入x元素

{

Nodep= this. head ;

for (;p. next != null && p. next . data .compareTo(x)>0;)

p=p. next ;

p. next = new Node(x, p.next );

return p. next ;

}

public Node search(T key)// 查找,返回首次出现的关键字为key 元素

{

for (Node

p=this . head ;p. next != null &&https://www.360docs.net/doc/715133894.html,pareTo(p.data )<=0;p=p. next )

if (https://www.360docs.net/doc/715133894.html,pareTo(p.next . data )==0)

return p;

return null;

}

}

( 6)、

e、

package ex2;

public class Del1 {

public Del1( int i, int k){

Integer[] values={1,5,6,10,13};

SinglyList list=new SinglyList(values);

System. out .println( list.toString());

for ( int j=0;j

list.remove(i);

System. out .println(" 删除后: " +list.toString());

}

public static void main(String[] args){

数据结构试题及答案

数据结构试题 一、单选题 1、在数据结构的讨论中把数据结构从逻辑上分为(C ) A 内部结构与外部结构 B 静态结构与动态结构 C 线性结构与非线性结构 D 紧凑结构与非紧凑结构。 2、采用线性链表表示一个向量时,要求占用的存储空间地址(D ) A 必须是连续的 B 部分地址必须是连续的 C 一定是不连续的 D 可连续可不连续 3、采用顺序搜索方法查找长度为n的顺序表时,搜索成功的平均搜索长度为( D )。 A n B n/2 C (n-1)/2 D (n+1)/2 4、在一个单链表中,若q结点是p结点的前驱结点,若在q与p之间插入结点s,则执行( D )。 A s→link = p→link;p→link = s; B p→link = s; s→link = q; C p→link = s→link;s→link = p; D q→link = s;s→link = p; 5、如果想在4092个数据中只需要选择其中最小的5个,采用( C )方法最好。 A 起泡排序 B 堆排序 C 锦标赛排序 D 快速排序 6、设有两个串t和p,求p在t中首次出现的位置的运算叫做( B )。 A 求子串 B 模式匹配 C 串替换 D 串连接 7、在数组A中,每一个数组元素A[i][j]占用3个存储字,行下标i从1到8,列下标j从1到10。所有数组元素相继存放于一个连续的存储空间中,则存放

该数组至少需要的存储字数是( C )。 A 80 B 100 C 240 D 270 8、将一个递归算法改为对应的非递归算法时,通常需要使用( A )。 A 栈 B 队列 C 循环队列 D 优先队列 9、一个队列的进队列顺序是1, 2, 3, 4,则出队列顺序为( C )。 10、在循环队列中用数组A[0..m-1] 存放队列元素,其队头和队尾指针分别为front和rear,则当前队列中的元素个数是( D )。 A ( front - rear + 1) % m B ( rear - front + 1) % m C ( front - rear + m) % m D ( rear - front + m) % m 11、一个数组元素a[i]与( A )的表示等价。 A *(a+i) B a+i C *a+i D &a+i 12、若需要利用形参直接访问实参,则应把形参变量说明为( B )参数。 A 指针 B 引用 C 值 D 变量 13、下面程序段的时间复杂度为( C ) for (int i=0;i

数据结构线性表2答案

习题二 一、选择题 1.在一个长度为n的顺序表中删除第i个元素(0<i

(完整版)数据结构线性表的主要程序代码

数据结构顺序表的主要代码(LIZHULIN) 1./***有头结点的单链表的初始化、建立(表头插入、表尾插入)、求长度、插入、删除、输出***/ /***********单链表的初始化、建立、输出*****************/ #include #include typedef struct Lnode { /*定义线性表的单链表存储结构*/ int data; struct Lnode *next; }LinkList; /****************单链表的初始化*************************/ Initlist(LinkList *L) { /*动态申请存储空间*/ L = (LinkList *)malloc(sizeof(struct Lnode));/*建立头结点*/ L->next = NULL; } /*************建立一个带头结点的单链表,在表尾插入***************/ Create_L(LinkList *L,int n) { LinkList *p,*q; int i; Initlist(L); /*单链表初始化*/ q=L; printf("input the value\n"); for(i = n;i>0;--i) { p = (LinkList*)malloc(sizeof(struct Lnode)); scanf("%d",&p->data); /*输入元素值*/ q->next = p; p->next = NULL; q=p; /*插入到表尾*/ } } /* Create_L */ /*************建立一个带头结点的单链表,在表头插入************** Create_L(LinkList *L,int n) { LinkList *p; int i;

数据结构线性表答案

第一章线性表 2.1 描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。 解:头指针是指向链表中第一个结点的指针。首元结点是指链表中存储第一个数据元素的结点。头结点是在首元结点之前附设的一个结点,该结点不存储数据元素,其指针域指向首元结点,其作用主要是为了方便对链表的操作。它可以对空表、非空表以及首元结点的操作进行统一处理。 2.2 填空题。 解:(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与元素在表中的位置有关。 (2) 顺序表中逻辑上相邻的元素的物理位置必定紧邻。单链表中逻辑上相邻的元素的物理位置不一定紧邻。 (3) 在单链表中,除了首元结点外,任一结点的存储位置由其前驱结点的链域的值指示。 (4) 在单链表中设置头结点的作用是插入和删除首元结点时不用进行特殊处理。 2.3 在什么情况下用顺序表比链表好?

解:当线性表的数据元素在物理位置上是连续存储的时候,用顺序表比用链表好,其特点是可以进行随机存取。 2.4 对以下单链表分别执行下列各程序段,并画出结果示意图。 解:

2.5 画出执行下列各行语句后各指针及链表的示意图。 L=(LinkList)malloc(sizeof(LNode)); P=L; for(i=1;i<=4;i++){ P->next=(LinkList)malloc(sizeof(LNode)); P=P->next; P->data=i*2-1; } P->next=NULL; for(i=4;i>=1;i--) Ins_LinkList(L,i+1,i*2); for(i=1;i<=3;i++) Del_LinkList(L,i); 解: 2.6 已知L是无表头结点的单链表,且P结点既不是

数据结构课后习题及答案

填空题(10 * 1’ = 10’) 一、概念题 .当对一个线性表经常进行的是插入和删除操作时,采用链式存储结构为宜。 .当对一个线性表经常进行的是存取操作,而很少进行插入和删除操作时,最好采用顺序存储结构。 .带头结点的单链表L中只有一个元素结点的条件是L->Next->Next==Null。 .循环队列的引入,目的是为了克服假溢出。 .长度为0的字符串称为空串。 .组成串的数据元素只能是字符。 .设T和P是两个给定的串,在T中寻找等于P的子串的过程称为模式匹配,又称P为模式。 .为了实现图的广度优先搜索,除一个标志数组标志已访问的图的结点外,还需要队列存放被访问的结点实现遍历。 .广义表的深度是广义表中括号的重数 .有向图G可拓扑排序的判别条件是有无回路。 .若要求一个稠密图的最小生成树,最好用Prim算法求解。 . 直接定址法法构造的哈希函数肯定不会发生冲突。 .排序算法所花费的时间,通常用在数据的比较和交换两大操作。 .通常从正确性﹑可读性﹑健壮性﹑时空效率等几个方面评价算法的(包括程序)的质量。 .对于给定的n元素,可以构造出的逻辑结构有集合关系﹑线性关系树形关系﹑图状关系四种。 .存储结构主要有顺序存储﹑链式存储﹑索引存储﹑散列存储四种。 .抽象数据类型的定义仅取决于它的一组逻辑特性,而与存储结构无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部使用。 .一个算法具有五大特性:有穷性﹑确定性﹑可行性,有零个或多个输入﹑有一个或多个输入。 .在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s->prior= p->prior; s->next= p; p->prior- next= s; p->prior= s;。 .在单链表中设置头结点的作用是不管单链表是否为空表,头结点的指针均不空,并使得对单链表的操作(如插入和删除)在各种情况下统一。 .队列是限制在表的一端进行插入和在另一端进行删除的线性表,其运算遵循先进先出原则。 .栈是限定尽在表位进行插入或删除操作的线性表。 .在链式队列中,判定只有一个结点的条件是(Q->rear==Q->front)&&(Q->rear!=NULL)。 .已知链队列的头尾指针分别是f和r,则将x入队的操作序列是node *p=(node *)malloc(node); p->next=x; p->next=NULL; if(r) {r->next=p; r=p;} else {r=p; f=p;}。 .循环队列的满与空的条件是(rear+1)%MAXSIZE==fornt和(front=-1&&rear+1==MAXSIZE)。 .串是一种特殊的线性表,其特殊性表现在数据元素都是由字符组成。 .字符串存储密度是串值所占存储位和实际分配位的比值,在字符串的链式存储结构中其结点大小是可变的。 .所谓稀疏矩阵指的是矩阵中非零元素远远小于元素总数,则称该矩阵为矩阵中非零元素远远小于元素总数,则称该矩阵为稀疏矩阵。 .一维数组的逻辑结构是线性结构,存储结构是顺序存储结构;对二维或多维数组,分别按行优先和列优先两种不同的存储方式。 .在有向图的邻接矩阵表示中,计算第i个顶点入度的方法是求邻接矩阵中第i列非0元素的个数。 网中,结点表示活动,边表示活动之间的优先关系,AOE网中,结点表示事件,边表示活动。 .按排序过程中依据不同原则对内部排序方法进行分类,主要有选择排序﹑交换排序﹑插入排序归并排序等4类。 .在堆排序、快速排序和归并排序中若只从排序结果的稳定性考虑,则应选择归并排序方法;若只从平均情况下排序最快考虑,则应选择快速排序方法;若只从最坏情况下排序最快且要节省类存考虑,则应选择堆排序方法。 .直接插入排序用监视哨的作用是存当前要的插入记录,可又省去查找插入位置时对是否出界的判断。 .设表中元素的初始状态是按键值递增的,则直接插入排序最省时间,快速排序最费时间。 .下列程序判断字符串s是否对称,对称则返回1,否则返回0;如?(“abba”)返回1,?(”abab”)返回0. Int f (char*s) { Int i=0,j=0; 求串长*/

数据结构《线性表的应用》实验报告

实验报告——线性表应用一、实验目的 用单链表储存一元多项式,并实现两个多项式的相加运算。 二、实验内容 1.先创建链表,存储多项式; 2.输出多项式; 3.两个多项式相加; 4.输出多项式。 三、程序代码 #include #include #include //一元多项式链式储存的节点结构 typedef struct Polynode { float coef; int exp; struct Polynode * next; } Polynode , * Polylist; //建立一元多项式的链表 Polylist polycreate() { Polynode * head,* rear,* s; float c; int e; head=(Polynode* )malloc(sizeof(Polynode)); rear=head; scanf("%f,%d",&c,&e); while(c!=0) { s=(Polynode * )malloc(sizeof(Polynode)); s->coef=c; s->exp=e; rear->next=s; rear=s; scanf("%f,%d",&c,&e); } rear->next=NULL; return(head); } //输出多项式

void print(Polynode*L) { Polynode*p; p=L->next; printf("a="); if(p&&p->coef!=0) printf("%.2f*x^%d",p->coef,p->exp); while(p->next!=NULL) { if((p->next->coef)>0&&p) printf("+"); else printf("-"); p=p->next; printf("%.2f*x^%d",fabs(p->coef),p->exp); } } //多项式相加 void polyadd(Polylist polya,Polylist polyb) { Polynode*p,*q,*tail,*temp; int sum; p=polya->next; q=polyb->next; tail=polya; while (p!=NULL&&q!=NULL) { if(p->expexp) {tail ->next=p; tail=p;p=p->next;} else if (p->exp==q->exp); {sum=p->coef+q->coef; if(sum!=0) {p->coef=sum; tail->next=p;tail=p; p=p->next; temp=q;q=q->next;free(temp); } else { temp=p;p=p->next;free(temp); temp=q;q=q->next;free(temp); } }

数据结构实验一顺序表的实现

数据结构实验一顺序表的实现 班级学号分数 一、实验目的: 1.熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现; 2.以线性表的各种操作的实现为重点; 3.通过本次学习帮助学生加深C语言的使用,掌握算法分析方法并对已经设计 出的算法进行分析,给出相应的结果。 二、实验要求: 编写实验程序,上机运行本程序,保存程序的运行结果,结合程序进行分析并写出实验报告。 三、实验容及分析: 1.顺序表的建立 建立一个含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 程序如下: 头文件SqList.h的容如下: #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int ElemType; typedef int Status; typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L) { L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));

if(!L->elem) return(OVERFLOW); L->length=0; L->listsize=LIST_INIT_SIZE; return OK; } Status CreatList_Sq(SqList *L,int n) { int i; printf("输入%d个整数:\n",n); for(i=0;ielem[i]); return OK; } //以下是整个源程序: #include #include"SqList.h" int main() { int i,n; SqList a; SqList *l = &a; if(InitList_Sq(l)==-2) printf("分配失败"); printf("\n输入要建立的线性表l的长度n:");//输入线性表得长度scanf("%d",&n); l->length=n; printf("线性表的长度是:%d\n",l->length); CreatList_Sq(l,n);//生成线性表 printf("输出线性表l中的元素值:");//输出线性表中的元素 for(i=0;ilength;i++) printf("%7d",l->elem[i]); getchar(); } 程序的运行结果:

数据结构试题答案

第一章概论 一、选择题 1、研究数据结构就是研究(D )。 A. 数据的逻辑结构 B. 数据的存储结构 C. 数据的逻辑结构和存储结构 D. 数据的逻辑结构、存储结构及其基本操作(研究非数值计算的程序设计问题中,计算机操作对象以及他们之间的关系和操作) 2、算法分析的两个主要方面是( A )。 A. 空间复杂度和时间复杂度 B. 正确性和简单性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 3、具有线性结构的数据结构是( D )。(线性结构就是:在非空有限集合中,存在为一个被称为第一个的数据元素和最后一个元素,有除了第一个元素,集合中每一个元素均只有一个前驱,除了最后一个元素有唯一后继)(链表、栈、队列、数组、串) A. 图 B. 树 C. 广义表(线性表的推广) D. 栈 4、计算机中的算法指的是解决某一个问题的有限运算序列,它必须具备输入、输出、(B )等5个特性。 A. 可执行性、可移植性和可扩充性 B. 可执行性、有穷性和确定性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和确定性 5、下面程序段的时间复杂度是( C )。 for(i=0;i

6、算法是(D )。为了解决某一问题而规定的一个有限长的操作序列 A. 计算机程序 B. 解决问题的计算方法 C. 排序算法 D. 解决问题的有限运算序列 7、某算法的语句执行频度为(3n+nlog2n+n2+8),其时间复杂度表示(C )。 A. O(n) B. O(nlog2n) C. O(n2) D. O(log2n) 8、下面程序段的时间复杂度为( C )。 i=1; while(i<=n) i=i*3; A. O(n) B. O(3n) C. O(log3n) D. O(n3) 9、数据结构是一门研究非数值计算的程序设计问题中计算机的数据元素以及它们之间的(B )和运算等的学科。(关系和操作) A. 结构 B. 关系 C. 运算 D. 算法 10、下面程序段的时间复杂度是( A )。 i=s=0; while(s

数据结构线性表的应用实验报告

实验报告 课程名称____数据结构上机实验__________ 实验项目______线性表的应用____________实验仪器________PC机___________________ 系别_____电子信息与通信学院___ 专业________ ___ 班级/学号______ __ 学生姓名______ ___________ 实验日期_______________________ 成绩_______________________ 指导教师_______________________

实验一.线性表的应用 1.实验目的:掌握线性链表的存储、运算及应用。利用链 表实现一元多项式计算。 2.实验内容: 1)编写函数,实现用链表结构建立多项式; 2)编写函数,实现多项式的加法运算; 3)编写函数,实现多项式的显示; 4)测试:编写主函数,它定义并建立两个多项式,显示 两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。 选做内容:修改程序,选择实现以下功能: 5)多项式求值:编写一个函数,根据给定的x值计算并 返回多项式f(x)的值。测试该函数(从终端输入一个x的值,调用该函数并显示返回结果)。 6)多项式相减:编写一个函数,求两个多项式相减的多 项式。 7)多项式相乘:编写一个函数,求两个多项式的乘积多 项式。 3.算法说明: 1)多项式的建立、显示和相加算法见讲义。可修改显示 函数,使输出的多项式更符合表达规范。

2)多项式减法:同次项的系数相减(缺项的系数是0)。 例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x) =4x3-5x2-x+3。提示:a(x)-b(x) = a(x)+(-b(x))。 3)多项式乘法:两个多项式的相乘是“系数相乘,指数 相加”。算法思想是用一个多项式中的各项分别与另 一个多项式相乘,形成多个多项式,再将它们累加在 一起。例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则 a(x)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3) = (20x5-8x4-12x3) + (-15x3+6x2+9x) = 20x5-8x4-27x3+6x2+9x。 4.实验步骤: 根据实验报告的要求,我对文件夹里的C文件进行了丰 富和修改,步骤如下: 链表结构建立多项式: typedef struct polynode { float coef; //系数 int exp; //指数 struct polynode *next; //下一结点指针 } PNode; 编写函数,实现多项式的加法运算; PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。

数据结构习题与答案

第 1 章绪论 课后习题讲解 1. 填空 ⑴()是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 【解答】数据元素 ⑵()是数据的最小单位,()是讨论数据结构时涉及的最小数据单位。 【解答】数据项,数据元素 【分析】数据结构指的是数据元素以及数据元素之间的关系。 ⑶从逻辑关系上讲,数据结构主要分为()、()、()和()。 【解答】集合,线性结构,树结构,图结构 ⑷数据的存储结构主要有()和()两种基本方法,不论哪种存储结构,都要存储两方面的内容:()和()。 【解答】顺序存储结构,链接存储结构,数据元素,数据元素之间的关系 ⑸算法具有五个特性,分别是()、()、()、()、()。 【解答】有零个或多个输入,有一个或多个输出,有穷性,确定性,可行性 ⑹算法的描述方法通常有()、()、()和()四种,其中,()被称为算法语言。 【解答】自然语言,程序设计语言,流程图,伪代码,伪代码 ⑺在一般情况下,一个算法的时间复杂度是()的函数。 【解答】问题规模 ⑻设待处理问题的规模为n,若一个算法的时间复杂度为一个常数,则表示成数量级的形式为(),若为n*log25n,则表示成数量级的形式为()。 【解答】Ο(1),Ο(nlog2n) 【分析】用大O记号表示算法的时间复杂度,需要将低次幂去掉,将最高次幂的系数去掉。 2. 选择题 ⑴顺序存储结构中数据元素之间的逻辑关系是由()表示的,链接存储结构中的数据元素之间的逻辑关系是由()表示的。 A 线性结构 B 非线性结构 C 存储位置 D 指针 【解答】C,D 【分析】顺序存储结构就是用一维数组存储数据结构中的数据元素,其逻辑关系由存储位置(即元素在数组中的下标)表示;链接存储结构中一个数据元素对应链表中的一个结点,元素之间的逻辑关系由结点中的指针表示。

数据结构实验线性表及其应用

计算机系数据结构实验报告(1) 实验目的: 帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。 问题描述: 1、构造一个空的线性表L。 2、在线性表L的第i个元素之前插入新的元素e; 3、在线性表L中删除第i个元素,并用e返回其值。 实验要求: 1、分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线 性表的基本操作算法。 2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行 分析。 算法分析: 由于两种存储结构都用来创建线性结构的数据表,可采用相同的输出模式和整体结构类似的算法,如下: 实验内容和过程: 顺序存储结构线性表程序清单: //顺序存储结构线性表的插入删除 #include #include <> using namespace std; # define LISTSIZE 100 # define CREMENTSIZE 10 typedef char ElemType; //定义数据元素类型为字符型 typedef struct { ElemType *elem; //数据元素首地址

int len; //当前元素个数 int listsize; //当前存储最大容量 }SqList; //构造一个空的线性表L int InitList(SqList &L) { =(ElemType *)malloc(LISTSIZE*sizeof(ElemType)); if (! exit(-2); //分配空间失败 =0; =LISTSIZE; } //在顺序线性表L中第i个位置之前插入新的元素e int ListInsert(SqList &L,int i,ElemType e) { if (i<1||i>+1) return -1; //i值不合法 if >= { ElemType *newelem=(ElemType *)realloc,+CREMENTSIZE)*sizeof(ElemType)); //存储空间已满,增加分配 if(!newelem) exit (-2); //分配失败 =newelem; +=CREMENTSIZE; } ElemType *q=&[i-1]) ; for (ElemType *p=&[]);p>=q;--p) *(p+1)=*p; //插入位置及其后的元素后移 *q=e; ++; return 1; } //在顺序线性表L中删除第i个元素,并用e返回其值 int ListDelete(SqList &L,int i,ElemType&e) { if (i<1||i> return -1; //i值不合法

数据结构 线性表 课后答案

第2章线性表 1.选择题 (1)顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。 A.110 B.108 C.100 D.120 答案:B 解释:顺序表中的数据连续存储,所以第5个元素的地址为:100+2*4=108。 (2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。 A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B.在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.将n个结点从小到大排序 答案:A 解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。 (3)向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为()。 A.8 B.63.5 C.63 D.7 答案:B 解释:平均要移动的元素个数为:n/2。 (4)链接存储的存储结构所占存储空间()。 A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 B.只有一部分,存放结点值 C.只有一部分,存储表示结点间关系的指针 D.分两部分,一部分存放结点值,另一部分存放结点所占单元数 答案:A (5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。 A.必须是连续的B.部分地址必须是连续的 C.一定是不连续的D.连续或不连续都可以 答案:D (6)线性表L在()情况下适用于使用链式结构实现。 A.需经常修改L中的结点值B.需不断对L进行删除插入 C.L中含有大量的结点D.L中结点结构复杂 答案:B

数据结构作业及答案

第一章绪论 一、选择题 1.数据结构是一门研究非数值计算的程序设计问题中计算机的1以及它们之间的2和运算等的学科。1 A.数据元素 B.计算方法 C.逻辑存储 D.数据映像 2 A.结构 B.关系 C.运算 D.算法 2.数据结构被形式地定义为(K, R),其中K是1的有限集,R是K上的2有限集。 1 A.算法 B.数据元素 C.数据操作 D.逻辑结构 2 A.操作 B.映像 C.存储 D.关系 3.在数据结构中,从逻辑上可以把数据结构分成。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4.线性结构的顺序存储结构是一种1的存储结构,线性表的链式存储结构是一种2的存储结构。A.随机存取 B.顺序存取 C.索引存取 D.散列存取 5.算法分析的目的是1,算法分析的两个主要方面其一是指2,其二是指正确性和简单性。1 A.找出数据结构的合理性 B.研究算法中的输入和输出的关系 C.分析算法的效率以求改进 D.分析算法的易懂性和文档性 2 A.空间复杂度和时间复杂度 B.研究算法中的输入和输出的关系 C.可读性和文档性 D.数据复杂性和程序复杂性k 6.计算机算法指的是1,它必须具备输入、输出和2等5个特性。 1 A.计算方法 B.排序方法 C.解决问题的有限运算序列 D.调度方法 2 A.可执行性、可移植性和可扩充性 B.可行性、确定性和有穷性 C.确定性、有穷性和稳定性 D.易读性、稳定性和安全性 7.线性表的逻辑顺序与存储顺序总是一致的,这种说法。A.正确 B.不正确 8线性表若采用链式存储结构时,要求内存中可用存储单元的地址。 A.必须连续的 B.部分地址必须连续的 C.一定是不续的D连续不连续都可以 9.以下的叙述中,正确的是。A.线性表的存储结构优于链式存储结构 B.二维数组是其数据元素为线性表的线性表C.栈的操作方式是先进先出D.队列的操作方式是先进后出10.每种数据结构都具备三个基本运算:插入、删除和查找,这种说法。A.正确B.不正确 二、填空题1.数据逻辑结构包括三种类型、和,树形结构和图形结构合称为。2.在线性结构中,第一个结点前驱结点,其余每个结点有且只有个前驱结点;最后一个结点后续结点,其余每个结点有且只有个后续结点。3.算法的五个重要特性是、、、、。 4.下面程序段的时间复杂度是。 for( i = 0; i < n; i++) for( j = 0; j < m; j++) A[i][j] = 0; 5.下面程序段的时间复杂度是。 i = s = 0; while ( s < n) { i ++; /* i = i +1*/ s += i; /* s = s + i*/ } 6.下面程序段的时间复杂度是。 s = 0; for( i = 0; i < n; i++) for( j = 0; j < n; j++) s += B[i][j]; sum = s; 7.下面程序段的时间复杂度是。 i = 1; while ( i <= n ) i = i * 3;

数据结构第二章线性表1习题

线性表专题 一、选择题 1.关于顺序存储的叙述中,哪一条是不正确的( ) A.存储密度大 B.逻辑上相邻的结点物理上不必邻接 C.可以通过计算直接确定第i个结点的位置 D.插入、删除操作不方便 2.长度为n的单链表连接在长度为m的单链表后的算法的时间复杂度为( ) A O(n) B O(1) C O(m) D O(m+n) 3.在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是:( ) A 访问第i个结点(1<=i<=n)和求第i个结点的直接前趋(2<=i<=n) B 在第i个结点(1<=i<=n)后插入一个新结点 C 删除第i个结点(1<=i<=n) D 将n个结点从小到大排序 4.一个向量第一个元素的存储地址是100 ,每个元素的长度为2 ,则第5 个元素的地址是:( ) (A )110 ( B )108 (C )100 (D )120 5.已知一个顺序存储的线性表,设每个结点需要占m个存储单元,若第一个结点的地址为da,则第i个结点的地址为:( ) A)da+(i-1)*m B) da+i*m C) da-i*m D) da+(i+1)*m 6.在具有n个结点的单链表中,实现()的操作,其算法的时间复杂度为O(n)。 A)遍历链表和求链表的第i个结点B)在地址为p的结点之后插入一个结点 C)删除开始结点D)删除地址为p的结点的后继结点 7.链表是一种采用()存储结构存储的线性表。 ( A )顺序(B )链式( C )星式(D )网状 8.线性表若采用链式存储结构时,要求内存中可用存储单元的地址:() ( A )必须是连续的( B )部分地址必须是连续的 ( C )一定是不连续的( D )连续或不连续都可以 9.线性表L在()情况下适用于使用链式结构实现。 (A)需经常修改L中的结点值(B)需不断对L进行删除插入 (C)L中含有大量的结点(D)L中结点结构复杂 10.在长度为n 的顺序表的第i (1≤i≤n+1) 个位置上插入一个元素,元素的移动次数为( )

数据结构线性表的基本操作及应用实验报告

实验日期2010.4.19 教师签字成绩 实验报告 【实验名称】第二章线性表的基本操作及应用 【实验目的】 (1)熟练掌握线性表的基本操作的实现; (2)以线性表的各种操作(建立、插入、删除等)的实现为重点; (3)通过本次实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。 【实验内容】 1.顺序表的基本操作(顺序表的插入、访问、删除操作) #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -1 typedef int ElemType; typedef int Status; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct{ ElemType *elem; int length; int listsize; }SqList; Status InitList_Sq(SqList *L){ int i,n; L->elem = (ElemType * )malloc(LIST_INIT_SIZE*sizeof(ElemType)); if (! L->elem) exit (OVERFLOW);

printf("您希望您的顺序表有几个元素: "); scanf("%d",&n); printf("\n"); printf("输入您的%d个元素,以构建顺序表: \n",n); for(i=1;i<=n;i++) scanf("%d",&L->elem[i-1]); L->length = n; L->listsize = LIST_INIT_SIZE; return OK; }//InitList_Sq Status PrintList_Sq(SqList L){ int i; printf("顺序表中的元素为:"); for (i=1;i<=L.length;i++) printf("%d ",L.elem[i-1]); printf("\n"); return OK; }//PrintList_Sq int ListInsert_Sq(SqList* L,int i,ElemType x) //对顺序表进行插入操作{int j; if (L->length==L->listsize) {printf("\t\t\t顺序表已满");return 0;} else { if (i<1||i>L->length) {printf("\t\t\t位置不合法");return 0;} else { for(j=L->length-1;j>=i-1;--j) L->elem[j+1]=L->elem[j]; L->elem[i-1]=x; L->length++; return 1; } } } int ListDelete_Sq(SqList* L,int i) //对顺序表进行删除操作 {int j; if (i<1||i>L->length) {printf("\t\t\t不存在第i个元素");return 0;} else { for (j=i-1;jlength;j++) {

数据结构C语言实现线性表插入键、交换、倒置

课题一的具体实验内容 1、构造元素类型为整型的线性表,将以下元素插入分别插入线性表: <34 56 20 9 15 5> 2、查找表中是否存在元素20,实现元素20与元素9的交换; 3、按照课题要求编写函数,实现线性表元素<34 56 9 20 15 5>的倒置,即倒置后的表应为< 5 15 20 9 56 34 >。 #include #include #define NULL 0 struct node { int num; struct node *next; }; void main() { int i; struct node *L,*s,*p,*h,*q,*k; L=(node*)malloc(sizeof(struct node)); //L->num=NULL; p=L; printf("请输入\n"); for(i=0;i<6;i++) { s=(node*)malloc(sizeof(struct node)); scanf("%d",&s->num); p->next=s; p=s; } p->next=NULL; //以上为链表的建立和输入 //以下为元素的交换 p=L; while(p->next->num!=20) p=p->next; h=p->next; p->next=p->next->next; h->next=p->next->next; p->next->next=h; p->next->next->next=h->next;

//free(h); //以下为链表的输出 p=L->next; printf("交换后输出\n"); while(p!=NULL) { printf("%d\n",p->num); p=p->next; } //以下为链表的倒置 p=L; while(p->next->next!=NULL) p=p->next; q=p->next; q->next=p; p->next=NULL; p=L; for(i=0;i<4;i++) {while(p->next->next!=NULL) p=p->next; k=p->next; k->next=p; p->next=NULL; p=L; } L->next=q; //倒置后链表的输出 p=L->next; printf("倒置后输出\n"); while(p!=NULL) { printf("%d ",p->num); p=p->next; } }

算法与数据结构 线性表答案

第2章 线性表 一、判断题 1 线性关系的逻辑结构与存储结构总是一致的。 解:错。单链表的逻辑结构与存储结构有可能是不一致的,有可能两个相邻结点的存储地址并不是相邻的。 2 每种数据结构都包括插入、删除和查找这三种基本运算。 解:错。散列结构无插入与删除运算;栈没有查找,查找须配有另一个栈。 3 线性表中的每个结点最多只有一个前驱和一个后继。 解:对。线性表的定义为:表中任意一个元素至多有一个前驱,至多有一后继。 4 线性的数据结构既可以顺序存储,也可以链接存储;非线性的数据结构则只能链接存储。 解:错。对于非线性的数据结构,若对它的数据规定某种次序之后,也可以顺序存储。如,树的前、中、后序遍历之后的存储,一个前驱可能对应多个后继。 5 顺序存储方式只能用于存储线性结构。 解:错。非线性结构也可采用顺序存储。 6 多维数组是向量的推广。 解:对。多维向量的存储方式实际上与一维向量是一致的。 7 设串s 的长度为n ,则s 的子串个数最多为n (n+1)/2。 解:错。s 的长度为n ,故它含有n 个字符,它的子串应包括:1个字符的子串,2个字符的子串,…,n 个字符的子串;这些子串的个数分别为 121)11(321-=-+=++++n n n n n n n C C C C 8 单链表从任何一个结点出发,都能访问到所有结点。 解:错。单链表仅能从头结点出发去访问所有结点,不能访问前驱。 9 线性表的长度是线性表所占用的存储空间的大小。 解:错。线性表所占用的存储空间大小为:每个结点所占用的存储字节数乘以线性表的长度。 10 双循环链表中,任意一结点的后继指针均指向其逻辑后继。 解:错。任意结点的后继结点包含有两个指针llink 和rlink ,只有rlink 指向其逻辑后继,而llink 指向其逻辑前驱。 11 数据结构、数据元素、数据项在计算机中的映象(或表示)分别称为存储结构、结点、数据域。 解:对。 12 线性表的顺序存储结构优于链式存储结构。 解:错。各有优缺点。 顺序存储结构的优点是: (1)存储效率高。(2)可随机访问任意结点,存取速度快。 顺序存储结构的缺点是: (1)插入与删除操作麻烦。(2)顺序表的长度扩充麻烦。 链式存储结构的优点是: (1)插入与删除方便。(2)顺序表的长度可任意(动态分配内存)。 链式存储结构的缺点是: (1)存储效率低。(2)对结点的访问不方便。

相关文档
最新文档