数据结构实验二(单链表基本操作)题目和源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验2:单链表基本操作

一、实验目的

1.学会定义单链表的结点类型,实现对单链表的一些基本操作和具体

的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。

2.掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。

二、实验要求

1.预习C语言中结构体的定义与基本操作方法。

2.对单链表的每个基本操作用单独的函数实现。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容

1.编写程序完成单链表的下列基本操作:

(1)初始化单链表La。

(2)在La中第i个元素之前插入一个新结点。

(3)删除La中的第i个元素结点。

(4)在La中查找某结点并返回其位置。

(5)打印输出La中的结点元素值。

2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、

Lb合并成一个有序单链表Lc。

合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc 之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。

3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。

(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。)

四、思考与提高

1.如果上面实验内容2中合并的表内不允许有重复的数据该如何操作?

2.如何将一个带头结点的单链表La分解成两个同样结构的单链表Lb,Lc,使得Lb中只含La表中奇数结点,Lc中含有La表的偶数结点?

/*----------------------------------------

* 02_单链表.cpp -- 单链表基本操作

* 对单链表的每个基本操作都用单独的函数来实现* 水上飘2009年写

----------------------------------------*/

// ds02.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include

using namespace std;

typedef int ElemType;

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode, *LinkList;

//确保输入的数据正确

int Oncemore()

{

int n ;

cout << "输入错误,请重新输入:" ;

cin >> n ;

cout << endl ;

if( n <= 2 )

n = Oncemore( ) ;

return n ;

}

//初始化单链表L

void InitList(LinkList &L)

{

L = (LinkList)malloc(sizeof(LNode));

L->next = NULL;

}

//逆位序创建一个带头结点的单链线性表

LinkList CreateList( LinkList &L, int n )

{

LinkList p ;

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

{

p = (LinkList)malloc(sizeof(LNode)) ;

p->data = (int)(rand()%100) ; //给新生成的结点随机赋一个值

p->next = L->next ; L->next = p ; //插入到表头

}

return L;

}

//在L中第i个元素之前插入一个新结点

void Insert(LinkList &L, int i)

{

LNode *p;

LNode *p1;

int m;

p1 = L->next ;

p = (LinkList)malloc(sizeof(LNode)) ;

p->data = (int)(rand()%100) ; //给新生成的结点随机赋一个值

for(m = 2; m < i; m++)

p1 = p1->next ;

if(m == i)

{

p->next = p1->next ;

p1->next = p;

cout << "在L中第i个元素之前插入一个新结点成功.";

}

else cout << "在L中第i个元素之前插入一个新结点失败.";

}

//删除La中的第i个元素结点

void Delete(LinkList &L, int j)

{

LNode *p;

LNode *p1;

int m;

p1 = L->next ;

for(m = 1; m < j; m++)

{

p1 = p1->next ;

if(m == (j-2))

p = p1; //p指向欲删除结点的

相关文档
最新文档