链表实验报告.docx
《链表实验报告.docx》由会员分享,可在线阅读,更多相关《链表实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
链表实验报告
链表实验报告
————————————————————————————————作者:
————————————————————————————————日期:
《数据结构》实验报告二
系别:
嵌入式系统工程系
班级:
嵌入式11003班
学号:
11160400314
姓名:
孙立阔
日期:
2012年4月9日
指导教师:
申华
一、上机实验的问题和要求:
单链表的查找、插入与删除。
设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。
具体实现要求:
1.从键盘输入10个字符,产生不带表头的单链表,并输入结点值。
2.从键盘输入1个字符,在单链表中查找该结点的位置。
若找到,则显示“找到了”;否则,则显示“找不到”。
3.从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
4.从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
5.将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
6.删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7.(★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
创建一个空的单链表,实现对单链表的查找,插入,删除的功能。
三、源程序及注释:
#defineOK 1
#define ERROR 0
#defineINFEASIBLE -1
#defineOVERFLOW -2
#defineTRUE 1
#define FALSE0
#defineList_Init_Size 10
#define ListIncrement2
typedefchar ET;
typedefET* Ep;
typedefint Status;
typedef structLNode{
ﻩ ET data;
structLNode*next;
}LNode,*LinkList;
/*LinkList La,Lb,Lc;*/ﻺ
#include "stdio.h"
#include "alloc.h"
/*Displaythe linklist'selements.*/
voidprintlk(LinkList L){
LinkListp;
p=L->next;
while(p) {
printf("%c->",p->data);
p=p->next;
}
printf("NULL\n");
}
/*Creatlinklist from headnode.*/
void CreatList( LinkList*L,intn){
inti;
LinkListp,q;
ETstr[20],c;
p=(LinkList)malloc(sizeof(LNode));
p->next=NULL;
*L=q=p;
printf("Pleaseinput thedata :
");
for (i=n;i>0;i--){
p=(LinkList)malloc(sizeof(LNode));
c=getche(); /*scanf("%c",&c);*/
printf("\n\n");
p->data=c;
p->next=q->next;
q->next=p;
}
}
/*Initthe linklist.*/
voidInit(LinkList*L){
int n;
printf("Pleaseinputthenumber ofthenode:
");
scanf("%d",&n);
CreatList(L,n);
}
/*GetthevalueofelementI;*/
intGetElem(LinkListL,inti,ET*e){
intj=1;
LinkListp;
p=L->next;
while(p&&j
p=p->next;
++j;
}
if(!
p||j>i)returnTRUE;
*e=p->data;
returnFALSE;
}
/*Inserta element afterI */
intListInsert(LinkList*L,inti,ETe){
/*Addyourowncodes. */
}
/*Delete theelementI */
intListDelete(LinkList*L,int i,ET *e)
{
/*Addyourowncodes.*/
}
intInsert(LinkList*L) {
inti,flag;
ETdata;
printf("Pleaseinputthe position:
");
scanf("%d",&i);
printf("Pleaseinputthedata:
");
data= getche(); /*scanf("%c",&data);*/
flag=ListInsert(L,i,data);
returnflag;
}
StatusDelete(LinkList *L){
inti,flag;
ETe;
printf("Pleaseinput thenumber :
");
scanf("%d",&i);
flag=ListDelete(L,i,&e);
printf("Deleted elementis%c\n",e);
return flag;
}
/*Findtheelement's position.*/
int LocateElem(LinkListL,ET e){
inti=0;
LinkListp;
p=L->next;
while(p){
i++;
if (p->data==e) return i;
}
return0;
}
/*Addthe LbaftertheLa.*/
voidUnion(LinkList*La,LinkList *Lb){
LinkListpa,pb;
/* Addyourowncodes.*/
}
/*Mergetwo sequenceintoone,don'tchangeany elementsin
these twolinklists.Jointwo sequenceto one. */
voidMergeList(LinkList *L1,LinkList*L2,LinkList*L3){
LinkList pa,pb,pc;
/*Add yourown codes.*/
}
/*ListtheMenu*/
void MenuList() {
printf("\n\n\n==========================\n");
printf("1*******InsertLA\n");
printf(" 2 *******InsertLB\n");
printf(" 3 *******Delete LA\n");
printf("4******* DeleteLB\n");
printf("5*******UnionLAand LB\n");
printf(" 6******* Merge LAandLBtoLC\n");
printf("7 ******* printLinkList\n");
printf("8 *******Exit\n");
printf("==========================\n");
}
/*Selectthemenu */
voidMenuSelect(LinkList*La,LinkList*Lb){
intselect,done=1;
LinkListLc;
while(done){
MenuList( );
printf("inputtheoperatingcode:
");
scanf("%d",&select);
switch(select){
case 1:
Insert(La);break;
ﻩcase2:
Insert(Lb);break;
ﻩcase 3:
Delete(La);break;
ﻩcase4:
Delete(Lb);break;
ﻩcase 5:
Union(La,Lb);break;
ﻩcase6:
MergeList(La,Lb,&Lc);
ﻩﻩprintf("LC:
");printlk(Lc);
ﻩbreak;
case7:
printf("LA:
");printlk(*La);
ﻩprintf("LB:
");printlk(*Lb);
break;
case8:
done=0;break;
ﻩ default:
printf(" ERROR\n");
}
}
}
main(){
LinkListLa,Lb;
printf("LA ");
Init(&La);
printlk(La);
printf("LB ");
Init(&Lb);
printlk(Lb);
MenuSelect(&La,&Lb);
}
调试后的代码:
#include<stdio.h>
#include<malloc.h>
typedefintDataType;
typedef structLinkList
{
intdata;
structLinkList *next;
}LinkList;
voidPrintList(LinkList*h);
LinkList*InitList();
voidInsList(LinkList*h,int i,DataType x);
voidLocList(LinkList*h,inti);
voidDelList(LinkList *h,int i);
voidmain()
{
inti,n,x;
LinkList*h;
ﻩh=InitList();
PrintList(h);
printf("\n===========\n");
printf("0------EXIT\n");
ﻩprintf("1------INSERT\n");
ﻩprintf("2------DELERT\n");
ﻩprintf("3------LOCERT\n");
printf("\n===========\n\n\n");
ﻩwhile
(1)
ﻩ{
ﻩprintf("\nSelect\n");
ﻩscanf("%d",&n);
switch(n)
ﻩ{
ﻩcase0:
ﻩﻩﻩexit(0);
ﻩbreak;
ﻩﻩcase1:
ﻩprintf("pleaseinputtheposition:
\n");
ﻩscanf("%d",&n);
ﻩﻩﻩprintf("pleaseinputthedata:
\n");
ﻩscanf("%d",&x);
InsList(h,n,x);
ﻩPrintList(h);
break;
ﻩcase2:
printf("pleaseinputyouwanttodelete position:
\n");
ﻩﻩﻩscanf("%d",&i);
ﻩﻩDelList(h,i);
ﻩﻩPrintList(h);
ﻩbreak;
ﻩcase3:
ﻩﻩprintf("pleaseinputyouwanttosearchposition:
\n");
ﻩscanf("%d",&i);
ﻩﻩLocList(h,i);
ﻩPrintList(h);
ﻩﻩbreak;
default:
ﻩprintf("error\n");
ﻩbreak;
ﻩ}
}
ﻩ
}
LinkList*InitList()
{
ﻩLinkList*h,*s,*r;
ﻩint a,c,i;
ﻩh=(LinkList*)malloc(sizeof(LinkList));
ﻩ h->next=NULL;
r=h;
ﻩprintf("pleaseinputsomelink'slength:
");
ﻩ scanf("%d",&c);
ﻩfor(i=0;i{
scanf("%d",&a);
ﻩs=(LinkList*)malloc(sizeof(LinkList));
ﻩs->data=a;
ﻩﻩs->next=r->next;
ﻩ r->next=s;
ﻩﻩr=r->next;
}
ﻩreturnh;
}
voidInsList(LinkList*h,inti,DataType x)
{
LinkList*s,*p;
ﻩint j=1;
ﻩp=h;
s=(LinkList*)malloc(sizeof(LinkList));
ﻩfor(j=1;j
=NULL;j++)
p=p->next;
ﻩif(p==NULL)
printf("error!
\n");
ﻩelse
{
ﻩs->data=x;
ﻩs->next=p->next;
p->next=s;ﻩﻩ
}
}
voidDelList(LinkList *h,inti)
{
LinkList*p,*q;
ﻩintj=1;
p=h->next;
ﻩq=p->next;
while(j!
=i-1 &&q!
=NULL)
ﻩ{
ﻩp=p->next;
ﻩq=q->next;
ﻩﻩj++;
ﻩ}
if(q==NULL)
printf("error!
\n");
else
ﻩ{
p->next=q->next;
ﻩﻩfree(q);
}
}
voidLocList(LinkList*h,inti)
{
LinkList*p;
int j=1;
p=h->next;
ﻩwhile(p!
=NULL)
{
ﻩif(p->data==i)
ﻩ{
ﻩprintf("position is%d\n",j);
ﻩbreak;
ﻩ}
ﻩp=p->next;
ﻩﻩj++;
}
if(p==NULL)
ﻩprintf("NOthisdatain thelink\n");
}
void PrintList(LinkList*h)
{
LinkList*p;
p=h->next;
ﻩwhile(p!
=NULL)
ﻩ{
ﻩprintf("%d ->",p->data);
p=p->next;
ﻩ}
}
四、运行输出结果:
五、调试和运行程序过程中产生的问题及采取的措施:
问题:
子函数和主函数前后的调用出现问题,指针的调用不是太明白。
措施:
根据编译器提示的错误逐个检查子函数前后的变量,以及寻求同学的帮助。
六、对算法的程序的讨论、分析,改进设想,其它经验教训:
看一段代码和亲自动手编写一套程序差别太大了,所以以后还要多亲手上机操作,还有对指针的调用方便还很欠缺,要多学习。
七、对实验方式、组织、设备、题目的意见和建议:
希望老师以后可以给我们多些自己动手实践的机会,可以在课堂上多让我们动手去上机操作,老师带领我们完成主要部分,或给一些提示指导。