实验2 单链表的实现与应用

合集下载

实验二 单链表实现

实验二 单链表实现

实验报告
课程名称数据结构课程设计
实验项目单链表的实现
实验仪器PC机一台
学院_____信息管理学院_______
专业电子商务
班级/学号___电子商务1401______
学生姓名____________
实验日期___12。

27_______
成绩_______________________指导教师_________________
北京信息科技大学
信息管理学院
(课程上机)实验报告
实验课程名称:数据结构课程设计专业:电子商务班级:商务1401学号:姓名:成绩:
Show_LinkList(Head);
Show_LinkList(HT);
contact(Head,HT); Show_LinkList(Head);
return 0;

5.实验总结:理解线性表的逻辑特点;掌握了单链表的定义及C语言实现.但是还有很多不清
楚的地方运行时有许多错误。

1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版
供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

实验二链表的实现和应用[最新]

实验二链表的实现和应用[最新]

实验二链表的实现和应用一、实验目的掌握线性表的链式存储结构设计与基本操作的实现二、实验内容与要求⑴定义线性表的链式存储表示;⑵基于所设计的存储结构实现线性表的基本操作;⑶编写一个主程序对所实现的线性表进行测试;⑷线性表的应用:①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;②设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。

三、数据结构设计在主函数中实现函数的调用,从而实现线性表的插入、删除、创建、显示等。

四、测试结果通过输入不同的数字(1~6)实现不同的操作,在两个线性表结合时,线性表二在源程序中已给出的,通过操作可以得到非单调递减的有序数列五、心得体会在写程序的过程中要注意分析,参照其他标准程序,多上机运行一点点的改正错误,这样才会有所提高。

MAIN.C 方丽平信计1203班1130112321 最后修改时间2014/3/31#include<stdio.h>#include<stdlib.h>#define maxsize 1024typedef int datatype;typedef struct node{datatype data;struct node * next;}linkList;int main(){linkList * CREATE();int INSERT(linkList *head, int value, int position);int DELETE(linkList *head, int position);int DISPLAY(linkList *head);linkList * COMBINE(linkList *head1, linkList *head2); linkList * head1;linkList * head2;linkList * head3;linkList * head;linkList * p1,* p2,* s1,* s2,* r1,* r2;int position, value, i;head1 = malloc(sizeof(linkList));r1 = head1;head2 = malloc(sizeof(linkList));r2 = head2;for(i = 0; i< 20; i++){s1 = malloc(sizeof(linkList));s1 ->data = i;r1 ->next = s1;r1 = s1;s2 = malloc(sizeof(linkList));s2 ->data = i + 2;r2 ->next = s2;r2 = s2;}r2 -> next = NULL;r1 -> next = NULL;while(1){printf("the program \n");printf("can realize to create,insert,delete,display,etc\n"); printf("1:create the ranked list\n");printf("2:insert a data\n");printf("3:delete a data\n");printf("4:display all the data\n");printf("5:Combine two link lists of operation\n"); printf("6:return,end of the program\n");printf("selection of operation\n");scanf("%d",&i);while ( i < 1 || i > 6 ){printf("please input again\n");scanf("%d",&i);}switch(i){case 1:head = CREATE();break;case 2:/*INSERT(p);*/printf("Please input insert place\n");scanf("%d",&position);printf("Please input insert value\n");scanf("%d",&value);INSERT(head, value, position);break;case 3:printf("Please input delete position\n");scanf("%d",&value);DELETE(head, position);break;case 4:DISPLAY(head);break;case 5:printf("The list 1:\n");DISPLAY(head1);printf("The list 2:\n");DISPLAY(head2);printf("The combine list:\n");head3 = COMBINE(head1, head2);DISPLAY(head3);break;case 6:exit(0);break;}}}linkList * CREATE(){int value;linkList * head,* s,* r;head = malloc(sizeof(linkList));r = head;printf("input the data of the number,input 55 over!");scanf("%d",&value);do{s = malloc(sizeof(linkList));s ->data = value;r ->next = s;r = s;printf("input the data of the number");scanf("%d",&value);}while(value != 55);r -> next = NULL;return head;}int INSERT(linkList *head,int value, int position){int j = 1;linkList *p,*s,*n;s = malloc(sizeof(linkList));s ->data = value;p = head;printf("Note:if the position is greater than the length of the table will be put in the final");while(j < position){if( (p -> next) != NULL ){p = p -> next;}j ++;}n = p -> next;s -> next =n;p -> next = s;return 0;}int DELETE(linkList *head, int position){int j;linkList *p;linkList *s;p = head;printf("Note:if the position is greater than the length of the table will be delete nothing!");for(j = 1;j < position; j ++){if( (p -> next) != NULL ){p = p -> next;}else{return 0;}}s = p -> next;if((s -> next) != NULL){(*p).next = (*s).next;}s = NULL;return 0;}int DISPLAY(linkList *head){linkList *p;int i;i = 0;p = head -> next;while(p != NULL){printf("%5d",(*p).data);p = p -> next;i ++;if(i % 5 == 0)printf("\n");}return 0;}linkList * COMBINE(linkList *head1, linkList *head2) {linkList *head,*r;linkList *p1, *p2,*s;head = malloc(sizeof(linkList));r = head;p1 = malloc(sizeof(linkList));p2 = malloc(sizeof(linkList));p1 = head1 -> next;p2 = head2 -> next;do{s = malloc(sizeof(linkList));if( (p1 != NULL) && (p2 != NULL) ){if(p1 -> data < p2 -> data ){s -> data = p1 -> data;p1 = p1 ->next;}else{s -> data = p2 -> data;p2 = p2 ->next;}}else if( (p1 != NULL) && (p2 == NULL) ){s -> data = p1 -> data;p1 = p1 ->next;}else if( (p2 != NULL) && (p1 == NULL) ){s -> data = p2 -> data;p2 = p2 ->next;}r ->next = s;r = s;}while( (p1 != NULL) || (p2 != NULL) );return head;}。

实验二 单链表基本操作的实现

实验二 单链表基本操作的实现

实验二单链表基本操作的实现【实验课程名称】数据结构【实验项目名称】单链表基本操作的实现【实验目的】1 理解单链表的存储结构及基本操作的定义;2掌握单链表存储基本操作;3学会设计实验数据验证程序。

【实验仪器及环境】计算机,window xp操作系统,VC++6.0【实验内容及步骤】1.单链表顺序存储基本操作存储结构定义:typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}*Link,*Position;typedef struct{ //链表类型Link head,tail;int len;}LinkList;实现的基本操作:#include<iostream>#include<malloc.h>#include<stdlib.h>#include<iomanip>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef int ElemType;typedef struct LNode{ //结点类型ElemType data;struct LNode *next;}*Link,*Position;typedef struct{ //链表类型Link head,tail;int len;Position MakeNode_L(Link &p,ElemType e) //创建结点{p=(Link)malloc(sizeof(LNode));if(!p) return ERROR;p->data=e;p->next=NULL;return p;}void FreeNode_L(Link &q) //释放结点{free(q);}Status InitList_L(LinkList &L){//初始化L为一个带头结点的空链表,头尾指针指向头结点,表长赋ElemType e;e=-1;//实际应用中此初始化语句需要修改if(!MakeNode_L(L.head,e))return ERROR;//开辟头结点L.tail=L.head;L.len=0;return OK;}//InitList_LStatus DestroyList_L(LinkList &L){//销毁链表LLink p;while(p=L.head->next){//依次释放有序链表中第一个元素至最后一个元素所占用空间;L.head->next=p->next;free(p);}free(L.head);L.head=NULL;L.tail=NULL;L.len=0;cout<<endl<<"The list has been destroyed!"<<endl;return OK;}//DestroyList_LStatus ClearList_L(LinkList &L) {//清空线性单链表Link p,q;p=L.head->next;while(p){q=p->next;free(p);p=q;}L.tail=L.head;return OK;}Status InsFirst_L(LinkList &L,Link s) //在首元素前插入一个结点{s->next=L.head->next;if(!L.head->next)L.tail=s;L.head->next=s;L.len++;return OK;}Status DelFirst_L(LinkList &L,Link h,Link &q) //删除首结点{h=L.head;q=L.head->next;if(q){h->next=q->next;q->next=NULL;if(!h->next)L.tail=h;L.len--;return OK;}elsereturn ERROR;}Status Append_L(LinkList &L,Link s) //将两个链表跟一个字符串连接起来{Link q;if(!L.head->next)L.head->next=q=s;elseL.tail->next=q=s;while(q->next){q=q->next;}L.tail=q;return OK;}Position Remove_L(LinkList &L,Link &q) //删除尾结点{Link p;p=L.head;if(!L.head->next) cout<<"The LinkList is empty!"<<endl;else{while(p->next!=L.tail)p=p->next;q=L.tail;L.tail=p;L.tail->next=NULL;L.len--;}return q;}Status InsBefore_L(LinkList &L,Link &p,Link s) //在p指向的结点前插入一个结点{Link q;q=L.head;if(p==L.head) cout<<" 不能在这个地方插入元素!"<<endl;else{while(q->next!=p)q=q->next;s->next=p;q->next=s;}L.len++;return OK;}Status InsAfter_L(LinkList &L,Link &p,Link s) //在p指向的结点后插入一个结点{if(p==L.tail) L.tail=s;s->next=p->next;p->next=s;L.len++;return OK;}Status SetCurElem_L(Link &p,ElemType e) //改变p指向的结点的内容{p->data=e;return OK;ElemType GetCurElem_L(Link p) //获取p指向的结点的内容{return p->data;}int ListLength_L(LinkList L) //获取单链表的长度值{return L.len;}Status ListEmpty_L(LinkList L) //判断单链表是否为空,是返回,否返回{if(L.head==L.tail) return TRUE;else return FALSE;}Position GetHead_L(LinkList L) //获取头指针的地址{return L.head;}Position GetLast_L(LinkList L) //获取尾指针的地址{return L.tail;}Position PriorPos_L(LinkList L,Link p) //获取p的前驱{Link q;q=L.head;if(p==L.head->next) return NULL;elsewhile(q->next!=p)q=q->next;return q;}Position NextPos_L(LinkList L,Link p) //获取p的后继{if(!p->next) return NULL;return p->next;}Status LocatePos_L(LinkList L,int i,Link &p) //查找p在单链表中的位置iint j;if(i<1) return ERROR;p=L.head->next;for(j=1;j<i;j++)p=p->next;if(!p) return ERROR;return OK;}Status compare(ElemType x,ElemType y) //比较函数{if(x==y)return 1;elsereturn 0;}Status LocateElem_L(LinkList L,ElemType e,Link &p) //返回跟e相同的值,没有的话返回空指针{int i=0;p=L.head;do{i++;p=p->next;}while(p&&!compare(p->data,e));if(p)cout<<i<<endl;elsecout<<"It is not in here!"<<endl;return OK;}Status ListTraverse_L(LinkList L,Status(*visit(ElemType))) //每一个元素调用visit()函数{Link p;p=L.head->next;while(p->next){visit(p->data);p=p->next;}return OK;}Status ListInsert_L(LinkList &L,int i,ElemType e) //在第i个位置后插入一个元素{int j;Link p,s;s=(Link)malloc(sizeof(LNode));p=L.head->next;for(j=1;j<i;j++)p=p->next;s->data=e;s->next=p->next;p->next=s;L.len++;return OK;}Status ListDelete_L(LinkList &L,int i) //删除第i个元素的结点{if(i>L.len) return ERROR;int j;Link p;p=L.head->next;for(j=1;j<i-1;j++)p=p->next;p->next=p->next->next;L.len--;return OK;}Status MergeList_L(LinkList La,LinkList Lb,LinkList &Lc) //将两个字符串连接起来{Link p,q,t;p=La.head->next;q=Lb.head->next;while(p&&q){if(p->data<q->data){MakeNode_L(t,p->data);InsFirst_L(Lc,t);p=p->next;}else{MakeNode_L(t,q->data);InsFirst_L(Lc,t);q=q->next;}}while(p){MakeNode_L(t,p->data);InsFirst_L(Lc,t);p=p->next;}while(q){MakeNode_L(t,q->data);InsFirst_L(Lc,t);q=q->next;}return OK;}【测试数据及实验结果】int main(){LinkList la,lb,lc;Link p,q,s,k,t;InitList_L(la);InitList_L(lb);InitList_L(lc);cout<<"建立一个有个数据的顺序表La,各节点值依次为:,4,6,8,10,12,….,38,40"<<endl;cout<<"-----------------------------------"<<endl;for(int i=20;i>=1;i--){MakeNode_L(p,2*i);InsFirst_L(la,p);}q=la.head->next;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;cout<<endl<<"删除,节点"<<endl;cout<<"----------------------------------"<<endl;ListDelete_L(la,8);ListDelete_L(la,30);q=la.head->next;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"表长为:"<<la.len<<endl;cout<<"-----------------------------------"<<endl;cout<<" 在第五个结点后插入一个结点"<<endl;cout<<"-----------------------------------"<<endl;ListInsert_L(la,5,11);q=la.head->next;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"分别查找值为,45的元素"<<endl;cout<<"-----------------------------------"<<endl;LocateElem_L(la,28,s);LocateElem_L(la,45,s);cout<<"-----------------------------------"<<endl;cout<<"建立线性表Lb,各结点值依次为:"<<endl;cout<<"3,8,13,18,23,28,33,38,43,48,53,58,63,68,73,78"<<endl;cout<<"-----------------------------------"<<endl;for(int i=7;i>=0;i--){MakeNode_L(p,i*10+8);InsFirst_L(lb,p);MakeNode_L(p,i*10+3);InsFirst_L(lb,p);}q=lb.head->next;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"将La和Lb合并为线性表Lc"<<endl;cout<<"-----------------------------------"<<endl;MergeList_L(la,lb,lc);q=la.head->next;cout<<"-----------------------------------"<<endl;cout<<"输出La,Lb,Lc的以及各表的表长"<<endl;cout<<"-----------------------------------"<<endl;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;q=lb.head->next;while(q){cout<<setw(3)<<q->data;q=q->next;}cout<<endl;q=lc.tail;while(q){cout<<setw(3)<<q->data;q=PriorPos_L(lc,q);}cout<<endl;cout<<"-----------------------------------"<<endl;cout<<"清空线性表La,Lb;输出La,Lb的表长"<<endl;cout<<"-----------------------------------"<<endl;cout<<la.len<<endl<<lb.len<<endl<<lc.len<<endl;ClearList_L(la);cout<<la.len<<endl;ClearList_L(lb);cout<<lb.len<<endl;return 0;}【实验小结】举例说明求解什么样的问题用顺序存储,什么样的问题用链式存储较好?答:使用顺序存储结构的情况:(1)空间利用率较高;(2)存取某个元素速度快;(3)插入元素和删除元素存在元素移动,速度慢,耗时;(4)有空间限制,当需要存取的元素个数可能多于顺序表的元素个数时,会出现"溢出"问题.当元素个数远少于预先分配的空间时,空间浪费巨大。

实验二、线性表-单链表的实现

实验二、线性表-单链表的实现

实验二单链表的实现
一、实验目的
1.熟练掌握指针的使用;
2.熟练掌握使用分支语句进行决策;熟练掌握使用循环语句提高效率;
3.熟练掌握函数的使用。

4.熟练掌握链表的使用
二、实验要求
1.在上机前完成源程序;
2.能在机器上正确、调试运行程序;
3.本实验需提交实验报告。

4.实验报告文件命名方法:实验2_信管12xx_学号后两位_姓名.doc
三、实验内容和步骤
1.基于带头结点的单链表实现线性表的以下操作:
a)单链表初始化
b)插入
c)删除
d)查找
e)单链表判空
f)打印顺序表中的所有元素
g)* 删除递增有序单链表中所有值大于mink且小于maxk的元素。

h)* 将x插入到单链表的适当位置上,以保持单链表中元素的有序性。

i)* 将单链表进行就地逆置。

j)* 将两个单链表表合并为一个单链表。

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

试构造一个单链表C,其元素为A和B中元素的交集,且表
C中的元素也按值递增有序排列。

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

2.备份自己程序。

三、实验成绩考核方法
成绩考核方法主要为:
教师抽查部分学生,让他们演示自己写的程序。

教师提出问题,确定学生对程序的把握程度和熟练程度。

实验2-链表的应用

实验2-链表的应用

实验2 链表的应用一、实验目的●了解并掌握链表的概念与定义●能够实现并运用链表●熟练运用链表的基本操作二、实验环境●个人计算机一台,CPU主频1GHz以上,1GB以上内存,2GB以上硬盘剩余空间。

●Windows2000、Windows XP或Win 7操作系统●Code::Blocks(版本12.11或近似版本,英文版),或VC++ 6.0三、实验内容1 基本部分(必做)1.单向链表的创建与操作设单向链表中节点的数据域的数据类型为整型,编写函数实现以下操作:(1)实现单向链表的创建(包括初始化)与输出操作,节点的个数及节点的数据由用户输入。

(源代码:ds3-1.c)(2)查找给定的单链表中的第i个节点,并将其地址返回。

若不存在第i 个节点,则返回空地址。

(源代码:ds3-2.c)(3)查找给定的单链表中值为n的节点,并将其地址返回。

若不存在值为n的节点,则返回空地址。

同时,还应通过参数传回该节点的序号。

(源代码:ds3-3.c)(4)删除给定的单链表中的第i个节点,成功返回1,失败返回0。

(源代码:ds3-4.c)(5)删除给定的单链表中值为n的节点,成功返回1,失败返回0。

(源代码:ds3-5.c)(6)在给定的单链表的第i位上插入值为n的节点。

(源代码:ds3-6.c)(7)在给定单链表的值为m的节点的前面插入一个值为n的节点。

(源代码:ds3-7.c)2.双向循环链表的创建与操作设双向链表中节点的数据域的数据类型为整型,编写函数实现以下操作:(1)实现双向循环链表的创建(包括初始化)与输出操作,节点的个数及节点的数据可以在程序中直接确定。

(源代码:ds4-1.c)(2)删除给定的双向循环链表中值为n的节点,成功返回1,失败返回0。

(源代码:ds4-2.c)(3)在给定的双向循环链表中的第i位上插入值为n的节点,成功返回1,失败返回0。

(源代码:ds4-3.c)2 提高部分(选做)已知链表A和B中节点的值都按照从小到大的顺序排序,且任何两个节点的值都不相同。

实验2 单链表的实现与应用

实验2 单链表的实现与应用

实验报告课程名称数据结构实验项目单链表的实现及应用实验仪器PC机一台学院____ ____专业班级/学号_______________________学生姓名_______________________实验日期_______________________成绩_______________________指导教师________ _________(课程上机)实验报告实验课程名称: 数据结构专业: 班级:}}2、package ex2;public class SortedSinglyList<T extends Comparable <? super T>> extendsSinglyList<T>{//构造空排序单链表public SortedSinglyList(){super(); //默认调用父类构造方法SinglyList() }public SortedSinglyList(SinglyList<T> list){super(); //构造空单链表for (Node<T> p=list.head.next; p!=null; p=p.next)//直接插入排序,每趟插入1个元素this.insert(p.data); //排序单链表按值插入}//构造,将values数组中的所有对象按值插入public SortedSinglyList(T values[]){super();for(int i=0;i<values.length;i++)this.insert(values[i]);}public void set(int i, T x) //设置第i个元素值为x{throw new UnsupportedOperationException("set(int i, T x)"); ////不支持父类方public static void main(String[] args){new Del1(2,2);}}b、package ex2;public class Del2 {public Del2(int mink,int maxk){Integer[] values={1,3,9,17,34};SortedSinglyList<Integer> list = new SortedSinglyList<Integer>(values);System.out.println(list.toString());Node<Integer> p=list.head;int j=0;while(p.next!=null && p.next.data<=mink){p=p.next;j++;}while(p.next!=null &&p.next.data<maxk){list.remove(j);}System.out.println("list="+list.toString());}public static void main(String args[]){new Del2(2,18);}}public static void main(String args[]){new Meger();}}4、package Poly;public interface Subible<T> //可相加接口,T表示数据元素的数据类型{public void sub(T t); //+=加法,约定两元素相加规则public boolean removable(); //约定删除元素条件}package Poly;//项类,一元多项式的一项,实现可比较接口和可相加接口public class TermX implements Comparable<TermX>, Subible<TermX>{protected int coef, xexp; //系数,x指数(可为正、0)public TermX(int coef, int xexp) //构造一项{this.coef = coef;this.xexp = xexp;}public TermX(TermX term) //拷贝构造方法{this(term.coef, term.xexp);}//以“系数x^指数”的省略形式构造一元多项式的一项。

实验二 单链表基本操作

实验二  单链表基本操作

实验二单链表基本操作一、实验目的1.掌握握单链表的基本操作:新建、插入、删除、查找等运算。

二、实验要求1.认真阅读和掌握本实验的程序。

2.上机运行本程序。

3.保存和打印出程序的运行结果,并结合程序中的问题进行分析。

三、实验内容单链表基本操作的实现,这个程序中演示了单链表的创建、插入、删除和查找。

程序如下:#include<malloc.h>typedef struct node{int data;struct node *next;} NODE;/******************************************/NODE *Create()//问题1:该函数创建的带头结点的单链表,还是不带头结点的单链表?{NODE *p,*head;int x;head=(NODE *)malloc(sizeof(NODE));head->next=NULL;printf("Input data,-1 to End!\n");scanf("%d",&x);while(x!=-1){p=(NODE *)malloc(sizeof(NODE));p->data=x;p->next=head->next;head->next=p;scanf("%d",&x);}return(head);}/******************************************/void Output(NODE *head){NODE *p;p=head;printf("Begin to dump the LinkList...\n");while(p->next!=NULL){printf("->%d",p->next->data);p=p->next;}printf("\nThe LinkList ended!\n");}/******************************************/int Listlen(NODE *head){int i=0;NODE *p=head;while(p->next!=NULL){i++;p=p->next;}return(i);}/******************************************/int Get(NODE *head,int i)//问题2:将该函数修改成返回第i个元素的指针,若不存在,返回空{int j=0;NODE *p=head;while(p->next&&j<i){j++;p=p->next;}if(!p->next||j>i) return(0);else return(p->data);}/******************************************/void Del(NODE *head,int i){NODE *p=head;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next||j>i-1) printf("the position is wrong\n");elsep->next=p->next->next;}/******************************************/void Ins(NODE *head,int i,int e){NODE *p=head,*q;int j=0;while(p->next&&j<i-1){j++;p=p->next;}if(!p->next&&j>i-1) printf("Wrong position\n" );else{q=(NODE *)malloc(sizeof(NODE));q->data=e;q->next=p->next;p->next=q;}}/******************************************/main(){NODE *head;int length;int i,element;head=Create();Output(head);//以下函数调用(求长度、插入、删除、查找)能否改成菜单形式?如何改?length=Listlen(head);printf("the length of the link is %d\n",length);printf("input the order :\n");scanf("%d",&i);element=Get(head,i);printf("the element of the order is %d\n",element);printf("input the del position \n");scanf("%d",&i);Del(head,i);Output(head);printf("Input the insert posion and element:\n");scanf("%d%d",&i,&element);Ins(head,i,element);Output(head);}}。

实验报告二——单链表

实验报告二——单链表
三、源程序及注释:
#include <stdio.h>
#include <stdlib.h>
//单链表的定义:
typedef int DataType;//DataType可以是任何相应的数据类型如int, float或char
typedef struct node//结点类型定义
{DataType data;//结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
int a[10];
void main()
{
int i;
DataType key;
DataType x;
LinkList head;
ListNode *p;
LinkList CreateList(void);//单链表的建立
从键盘输入2个整数一个表示欲插入的位置i另一个表示欲插入的数值x从键盘输入1个整数表示欲删除结点的位巻输出单链表所有结点值观链表中含有原链表中序号为奇数的元链表中含有原链表中序号为偶数的元素且保持原来的相对顺序分别输出单链和单链表b的所有结点值观察输出结果
《数据
实验二—单链表
分校:上海第二工业大学
班级:09安全01
p->next=s;
}
//单链表的删除:
void DeleteList(LinkList head,int i)
{
ListNode *p,*r;
int j;
p=head;j=1;
while(p&&j<i-1)
{
p=p->next;
j++;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称数据结构
实验项目单链表的实现及应用
实验仪器PC机一台
学院____ ____
专业
班级/学号_______________________
学生姓名_______________________
实验日期_______________________
成绩_______________________
指导教师________ _________
(课程上机)实验报告实验课程名称: 数据结构专业: 班级:
}
}
2、
package ex2;
public class SortedSinglyList<T extends Comparable <? super T>> extends
SinglyList<T>{
//构造空排序单链表
public SortedSinglyList()
{
super(); //默认调用父类构造方法SinglyList() }
public SortedSinglyList(SinglyList<T> list)
{
super(); //构造空单链表
for (Node<T> p=list.head.next; p!=null; p=p.next)//直接插入排序,每趟插入1个元素
this.insert(p.data); //排序单链表按值插入
}
//构造,将values数组中的所有对象按值插入
public SortedSinglyList(T values[])
{
super();
for(int i=0;i<values.length;i++)
this.insert(values[i]);
}
public void set(int i, T x) //设置第i个元素值为x
{
throw new UnsupportedOperationException("set(int i, T x)"); ////不支持父类方
public static void main(String[] args){
new Del1(2,2);
}
}
b、
package ex2;
public class Del2 {
public Del2(int mink,int maxk)
{
Integer[] values={1,3,9,17,34};
SortedSinglyList<Integer> list = new SortedSinglyList<Integer>(values);
System.out.println(list.toString());
Node<Integer> p=list.head;
int j=0;
while(p.next!=null && p.next.data<=mink)
{
p=p.next;
j++;
}
while(p.next!=null &&p.next.data<maxk)
{
list.remove(j);
}
System.out.println("list="+list.toString());
}
public static void main(String args[])
{new Del2(2,18);}
}
public static void main(String args[])
{
new Meger();
}
}
4、
package Poly;
public interface Subible<T> //可相加接口,T表示数据元素的数据类型{
public void sub(T t); //+=加法,约定两元素相加规则
public boolean removable(); //约定删除元素条件
}
package Poly;
//项类,一元多项式的一项,实现可比较接口和可相加接口
public class TermX implements Comparable<TermX>, Subible<TermX>
{
protected int coef, xexp; //系数,x指数(可为正、0)
public TermX(int coef, int xexp) //构造一项
{
this.coef = coef;
this.xexp = xexp;
}
public TermX(TermX term) //拷贝构造方法
{
this(term.coef, term.xexp);
}
//以“系数x^指数”的省略形式构造一元多项式的一项。

//省略形式说明:当系数为1或-1且指数>0时,省略1,-1只写负号“-”,如x^2、-x^3;
//当指数为0时,省略x^0,只写系数;当指数为1时,省略^1,只写x。

public TermX(String termstr)
{
if (termstr.charAt(0)=='+') //去掉+号
termstr=termstr.substring(1);
public boolean equals(Object obj) //比较两个多项式是否相等
{
return this==obj || obj instanceof Polynomial &&
this.list.equals(((Polynomial)obj).list);
//比较两条单链表是否相等
}
}
package Poly;
public class Polynomial_ex
{
public static void main(String args[])
{
System.out.println("//一元多项式");
TermX aterms[]={new TermX(-7,9), new TermX(2,7), new TermX(-9,4), new
TermX(1,2),
new TermX(-1,1)}; //图2.25A(x),不要求数组排序
Polynomial apoly = new Polynomial(aterms);
Polynomial bpoly = new Polynomial("-1+x-x^2+10x^4-3x^8+5x^10");//图2.25B(x) Polynomial cpoly = apoly.union(bpoly);
System.out.println("A="+apoly.toString()+"\n\nB="+bpoly.toString()+"\n"); System.out.println("C=A-B,C="+cpoly.toString());
}
}
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模
版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。

相关文档
最新文档