线性表实验报告
一、实验的目的要求
1、了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。
2、掌握线性表的顺序存储结构的定义及其C语言实现。
3、掌握线性表的链式存储结构——单链表的定义及其C语言实现。
4、掌握线性表在顺序存储结构即顺序表中的各种基本操作。
5、掌握线性表在链式存储结构——单链表中的各种基本操作。
6、认真阅读和掌握实验的程序。
7、上机运行本程序。
8、保存和打印出程序的运行结果,并结合程序进行分析。
二、实验的主要内容
题目:请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。
具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕
菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后
在屏幕菜单中选择0,即可结束程序的运行。
三、解题思路分析
在链表中插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后插入的算法,在插入点的后面添加结点。
在链表中删除数据,先找到删除点,然后进行指针赋值操作。
四、程序清单
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int ElemType;
typedef struct LNode
{ElemType data;
struct LNode *next;
}LNode;
LNode *L;
LNode *creat_L();
void out_L(LNode *L);
void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e);
int locat_L(LNode *L,ElemType e);
void main()
{int i,k,loc;
ElemType e,x;
char ch;
do{printf("\n");
printf("\n 1.建立单链表");
printf("\n 2.插入元素");
printf("\n 3.删除元素");
printf("\n 4.查找元素");
printf("\n 0.结束程序运行");
printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k);
switch(k)
{case 1:{L=creat_L();
out_L(L);
}break;
case 2:{printf("\n请输入插入位置:");
scanf("%d",&i);
printf("\n请输入要插入元素的值:");
scanf("%d",&e);
insert_L(L,i,e);
out_L(L);
}break;
case 3:{printf("\n请输入要删除元素的位置:"); scanf("%d",&i);
x=delete_L(L,i);
out_L(L);
if(x!=-1)
{printf("\n删除的元素为:%d\n",x);
printf("删除%d后的单链表为:\n",x);
out_L(L);
}
else printf("\n要删除的元素不存在!");
}break;
case 4:{printf("\n请输入要查找的元素值:"); scanf("%d",&e);
loc=locat_L(L,e);
if(loc==-1)printf("\n为找到指定元素!");
else printf("\n已找到,元素位置是%d",loc); }break;
}
printf("\n----------------");
}while(k>=1&&k<5);
printf("\n 按回车键,返回...\n");
ch=getchar();
}
LNode *creat_L()
{ LNode *h,*p,*s; ElemType x;
h=(LNode *)malloc(sizeof(LNode));
h->next=NULL;
p=h;
printf("\n请输入第一个数据元素:");
scanf("%d",&x);
while(x!=-999)
{s= (LNode *)malloc(sizeof(LNode));
s->data=x; s->next=NULL;
p->next=s; p=s;
printf("请输入下一个数据:(输入-999表示结束.)"); scanf("%d",&x);
}
return(h);
}
void out_L(LNode*L)
{ LNode*p;
p=L->next; printf("\n\n");
while(p!=NULL)
{
printf("%5d",p->data);p=p->next;};
}
void insert_L(LNode*L,int i,ElemType e)
{ LNode *s,*p;
int j;
p=L;
j=0;
while(p!=NULL&&j<=i-1){p=p->next;j++;}
if(p==NULL||i<1) printf("\n插入位置错误!");
else { s=(LNode * )malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
ElemType delete_L(LNode *L,int i)
{ LNode *p, *q; int j; ElemType x;
p=L;j=0;
while(p->next!=NULL&&j<i-1){p=p->next;j++;}
if(!p->next||i<1) {printf("\n删除位置错误!");return(-1);} else{ q=p->next; x=q->data;
p->next=q->next; free(q);
return(x);
}
}
int locat_L(LNode *L,ElemType e)
{ LNode *p; int j=1;
p=L->next;
while(p!=NULL && p->data!=e) {p=p->next; j++;}
if(p!=NULL)return(j); else return(-1);
}
五、调试心得及收获。
1、链式存储在曾加、删除元素师效率高,线性表的链式存储方式是利用不连续的内存空
间来保存结点的信息。
2、在节点中,不仅需要保存结点本身的数据值,还需要利用指针域保存指向后继的指针
3、要编写一个线性表的程序,必须了解及熟悉掌握其每一项基本操作。
4、算法并不是程序,要运行必须加工。
六、其它所想到的。
使程序能在对链表结点进行删除或插入操作时先检查用户是否已经创建链表,若没有创建,则提示用户创建一个链表。