实验二 单链表实验
来源:互联网 发布:webuploader php 编辑:程序博客网 时间:2024/04/29 13:35
实验课程名:数据结构
专业班级: 11级计科专升本 学号: 姓名:
实验时间: 4.16 实验地点: K4-207 指导教师:
实验目的:
1、掌握实验用Visual C++6.0上机调试单链表的基本方法;
2、掌握单链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现;
3、进一步掌握循环单链表的插入、删除、查找算法的实现。
试验内容:
代码如下:
#include "stdafx.h"
#include<iostream.h>
#include<stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 10
#define ERROR 0
#define OK 1
typedef int ElemType;
/*链式存储类型 */
typedef struct LNode
{ ElemType data;
struct LNode *next;
}LNode,*LinkList;
//链表插入
int ListInsert(LinkList &L,int i,int e) //ListInsert_L() sub-function
{ LNode *p=L;
int j=0;
while(p&&j<i-1) //find the location
{ p=p->next;
++j;
}
if(!p||j>i-1) //out of location
{ cout<<"Errer! The location is illegal!"<<endl;
return (ERROR);
}
LNode *s;
s=(LinkList)malloc(sizeof(LNode)); //create new LNode
s->data=e;
s->next=p->next;
p->next=s;
return (OK);
} //ListInsert_L() end
/*单链表的取元素*/
int GetElem_L(LinkList L,int i,int &e)
{
LNode *p;
int j=1;
p=L->next;
while(p&&j<i)
{p=p->next;++j;}
if(!p||j>i)
{ cout<<"The NO. "<<i<<" element is not exist !"<<endl;
getch();
exit(0);
}
e=p->data;
return (e);
}
//单链表的排序(选择)
int sort(LinkList &Lc )
{
LNode *k,*j,*p=Lc->next;
int t;
for(;NULL!=p;p=p->next)
{
k=p;
for(j=p->next;NULL!=j;j=j->next)
if((j->data)<(k->data))
k=j;
t=k->data;
k->data=p->data;
p->data=t;
}
return (OK);
}
//单链表的合并
int Merger(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode *p=La->next,*q=Lb->next;
while(NULL!=p->next)
{
p=p->next;
}
p->next=q;
Lc=La;
cout<<"Success to Merge B and C !"<<endl;
return(1);
}
/*单链表的建立(尾插法)*/
void CreateList_L(LinkList &L,int n)
{
int i;
LNode *p,*q;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
q=L;
cout<<"请输入元素的值:";
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next=q->next;
q->next=p;
q=p;
}
if(n) cout<<"Success to Create a LinkList !"<<endl;
else cout<<"A NULL LinkList have been created !"<<endl;
}
//输出链表
void output(LinkList La)
{
LinkList p;
p=La->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl<<endl;
}
int main(int argc, char* argv[])
{
int a,b,i;
LinkList La,Lb,Lc;
cout<<"请输入链表La中的元素个数a并创建链表La:";
cin>>a;
CreateList_L(La,a);
cout<<"输出链表La:";
output(La);
cout<<"请输入链表Lb中的元素个数b并创建链表Lb:";
cin>>b;
CreateList_L(Lb,b);
cout<<"输出链表Lb:";
output(Lb);
cout<<"输出合并后的链表Lc:";
Merger(La,Lb,Lc);
sort(Lc);
output(La);
return 0;
}
任务一:已知单链表la和lb中的数据元素按非递减有序排列,将la和lb中的数据元素,合并为一个新的单链表lc,lc中的数据元素仍按非递减有序排列。要求①不破坏la表和lb表的结构。②破坏la表和lb表的结构。且从键盘读取元素。
任务二:编程实现两个循环单链表的合并。
//循环链表的合并(思想是头尾先拆开然后合并最后在把头尾结合并且如果需要排序那就用Sort函数排序)
int Merger(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LNode *p=La->next,*q=Lb->next;
while(La->next!=p->next)
{
p=p->next;
}
p->next=q;
while(Lb->next!=q->next)
{
q=q->next;
}
q->next=La->next;
Lc=La;
cout<<"Success to Merge B and C !"<<endl;
return(1);
}
/*循环链表的输出*/
void output(LinkList La)
{
LinkList p;
p=La->next;
int i=0;
while((p!=La->next) || i==0)
{
cout<<p->data<<" ";
p=p->next;
i++;
}
cout<<endl<<endl;
}
任务三:将一循环单链表就地逆置
//循环链表的逆置
void wart(LinkList &La)
{
LinkList p,q,rear;
int i=0;
q=p=La->next;
while(La != q->next)
{
while(p->next->next != La)
{
p=p->next;
}
if(i==0) //i用来保护尾指针砸在每一次的循环中被修改
{
rear=p->next;
}
i++;
p->next->next=p;
p->next=La;
}
La->next=rear;
}
//输出链表
void output(LinkList La)
{
LinkList p;
p=La->next;
//int i=0;
while((p!=La))
{
cout<<p->data<<" ";
p=p->next;
// i++;
}
cout<<endl<<endl;
}
实验总结:通过本实验使我了解了链表的基本建立和链表的使用,已经初步建立一些链表之类的删除,和动态管理一些链表的空间,对链表的初步使用。
- 实验二 单链表实验
- 实验二 单链表
- 实验二.单链表
- 实验二之单链表
- 实验二 单链表实现
- 实验二之单链表
- 【实验二】单链表的实验验证
- 实验二线性表综合实验-单链表
- 【实验二】串口实验
- 实验一&实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- Android ApiDemos示例解析(155):Views->Layouts->ScrollView->3. Internal Selection
- 去掉Word文档中的页眉横线
- 计算机中桌面背景存放位置
- 矿业工程文献分类
- Word中页眉文字下横线如何变化粗细线型,页脚文字上方如何添加横
- 实验二 单链表实验
- 用 JAVA 开发游戏连连看(之六)优化:让程序运行更稳定、更高
- 在Word中添加打印水印
- ISO文件基本知识
- 在ppt中如何对齐多个对象
- c语言的内存分配
- 如何在ppt中带走自己的字体
- 如何将演示文稿转换为WORD文档
- "无法删除文件夹,目录不是空的"解决办法