当前位置:
文档之家› 数据结构实验报告 单链表基本操作
数据结构实验报告 单链表基本操作
p=p->next;
}
-4-
} int main() { Linklist La,Lb,Lc;int m,n; printf("请输入 La 的元素个数:\n"); scanf("%d",&m); CreateList_L(La,m); printf("请输入 Lb 的元素个数:\n"); scanf("%d",&n); CreateList_L(Lb,n); printf("---------------------------------------------\n"); // Lc=(Linklist)malloc(sizeof(LNode)); 接使用 La 的头结点 // Lc->next=NULL; MergeList_L(La,Lb,Lc); printf("排列后结果如下:\n"); PrintList_L(Lc); return 0; } 这里不需要初始化头结点,在调用函数的时候直
pc = pa; pc = pb; free(Lb);
pa = pa->next; pb = pb->next;
} }
} pc->next = pa ? pa : pb; } Status PrintList_L(Linklist L) { Linklist p=L->next; while(p) { printf("%d printf("\n"); return OK; ",p->data);
实验报告 2
课程 数据结构 实验名称 单链表基本操作
专业 信息科学与技术类 年 9 班级_1 班__ 月 10 日 学号_ __ 实验日期: 2010
第
姓名 评分
页
一、实验目的
1. 学会定义单链表的结点类型,实现对单链表的一些基本操作和具体的函 数定义,了解并掌握单链表的类定义以及成员函数的定义与调用。 2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。
答: 1. 将上面程序 2 的 MergeList_L 函数换成下面的函数即可 void MergeList_Lnre(Linklist &La,Linklist &Lb,Linklist &Lc) {//按升序,不允许重复 //实验 2 思考与提高 Linklist pa,pb,pc; pa=La->next;pb=Lb->next; Lc=pc=La; while(pa&&pb) { if(pa->data<=pb->data) {if(pa->data!=pc->data) { pc->next=pa; pa=pa->next; } else// if(pb->data<=pa->data&&) {if(pb->data!=pc->data) { pc->next=pb; pc=pb;} pb=pb->next; } } Linklist q=pc; pc->next = pa ? pa : pb; while(pc) { if(pc->data==q->data) { q->next=pc->next; else { } } q=pc;pc=pc->next; pc=pc->next; pc=pa;。 2.对单链表的每个基本操作用单独的函数实现。 3.编写完整程序完成下面的实验内容并上机运行。 4.整理并上交实验报告。
三、实验内容
1.编写程序完成单链表的下列基本操作:
(1)初始化单链表 La。 (2)在 La 中插入一个新结点。 (3)删除 La 中的某一个结点。 (4)在 La 中查找某结点并返回其位置。 (5)打印输出 La 中的结点元素值。
-3-
排序,改变指针。输出。 3. 完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Linklist; Status CreateList_L(Linklist &L,int n) { Linklist p,q; int i=0; L=(Linklist)malloc(sizeof(LNode)); L->next=NULL; p=L; printf("请输入%d 个元素:\n",n); for(i=0;i<n;i++) { q=(Linklist)malloc(sizeof(LNode)); scanf("%d",&q->data); q->next=p->next; } return OK; } void MergeList_L(Linklist &La, Linklist &Lb, Linklist &Lc) { Linklist pa, pb, pc; pa = La->next; pb = Lb->next; while (pa && pb) { if(pa->data <= pb->data) { pc->next = pa; else { pc->next = pb; Lc = pc = La; p->next=q; p=q;
四、实验步骤
一: 1. 编写头文件及各个函数。其中函数有 CreateList_L() 创建函数,ListInsert_L() 插入函数, ListDelete_L() 删除元素函数,LocateElem_L() 查找元素函数,PrintList_L() 打印函数专门 用来输出改变之后的链表元素。 写主函数。在主函数里调用各个函数,注意对于非法输入可以进行进一步详细的分类。 在这个实验里, 对于插入删除的非法输入没有进行判断, 必要时可以对返回值进行条件 判断再决定输出情况。对于查找输入若是输入链表里没有的,就必须特别列出来。 3. 完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1
-1-
2.
#define FALSE 0 #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Linklist; Status CreateList_L(Linklist &L,int n) { Linklist p,q; int i=0; L=(Linklist)malloc(sizeof(LNode)); L->next=NULL; p=L; printf("请输入%d 个元素:\n",n); for(i=0;i<n;i++) { q=(Linklist)malloc(sizeof(LNode)); scanf("%d",&q->data); q->next=p->next; } return OK; } Status ListInsert_L(Linklist &L,int i,ElemType e) { Linklist s,p=L;int j=0; while(p&&j<i-1) { p=p->next;++j; } if(!p||j>i-1)return ERROR; s=(Linklist)malloc(sizeof(LNode)); s->data=e;s->next=p->next; p->next=s; return OK; } Status ListDelete_L(Linklist &L,int i,ElemType &e) { Linklist q,p=L;int j=0; while(p->next&&j<i-1) { p=p->next;++j; } if(!(p->next)||j>i-1)return ERROR; q=p->next;p->next=q->next; e=q->data;free(q); return OK; } Status LocateElem_L(Linklist L,ElemType e) { Linklist p;int j; p=L->next;j=1; while(p&&(p->data!=e)) //写成 while(p->data!=e&&p) 运行总是出错。
printf("查找不到该元素!\n");
printf("---------------------------------------------\n"); return 0; } 二: 1. 编写头文件及各个函数。这里函数有 CreateList_L() 创建函数,MergeList_L() 是排序函 2. 数。MergeList_L 函数不改变存储,只改变指针。PrintList_L() 用来打印结果。 写主函数。在主函数里输入元素个数,调用函数创建链表输入各个元素值。在调用函数
2 .构造两个带有表头结点的有序(假设升序)单链表 La、 Lb,编写程序实 现将 La、 Lb 合并成一个有序(假设升序)单链表 Lc。