线性表的基本操作及应用
一、实验目的
1、帮助复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉链表的操作为侧重点。
二、实验内容
单链表的基本操作
[问题描述]
实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求]
(1)依次从键盘读入数据,建立带头结点的单链表;
(2)输出单链表中的数据元素
(3)求单链表的长度;
(4)根据指定条件能够取元素和修改元素;
(5)实现在指定位置插入和删除元素的功能。
[测试数据]
单链表的结点类型定义:
//定义单链表的结点类型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkedList;
插入函数:
插入时需要输入插入的位置及插入元素,代码如下:
void ListInsert(LinkList &L,int e,int i)
{
LNode *p=L;
int j=0;
//查找第i-1个结点,p指向该结点
while(p&&(j<i-1)) {
p=p->next;
j++;
}
if(!p||j>i-1)
printf("位置错误!"); //i>n+1或者i<1,删除位置不合理
LNode *s=new LNode;//生成新结点*s
s->data=e; //将新结点*s的数据域置为e
s->next=p->next; //将结点*s的指针域指向结点*p的指针域
p->next=s; //将结点*p的指针域指向结点*s
}
修改函数:
先调用删除函数删除该位置的数据,然后再调用插入函数向其中插入一个数据
**删除函数:**代码如下
void ListDelete(LinkList &L,int i)
{
LNode *p=L;
int j=0;
//查找第i-1个结点,p指向该结点
while((p->next)&&(j<i-1))
{
p=p->next;
j++;
}
if((!p->next)||(j>i-1))
printf("位置错误!"); //i>n或i<1时,删除位置不合理
LNode *q=p->next; //临时保存被删除结点的地址以备释放
p->next=q->next;//改变删除结点前驱结点的指针域
delete q; //释放删除结点的空间
}
**查找函数:**代码如下
void GetElem(LinkList L)
{
LNode *p=L->next; //初始化,p指向首元结点
int j=1,i;
printf("请输入想要提取元素的位置:");
scanf("%d",&i);
while(p&&j<i)//顺链域向后扫描,直到p为空或p指向第i个元素
{
p=p->next;//p指向下一个结点
j++;
}
if(!p||j>i)
printf("取值位置错误!");
printf("%d\n",p->data);
}
输出函数:代码如下
void display(LinkList &L,int n)
{
LNode *p;
int i=0;
printf("单链表为:");
p=L->next;
while(p)
{
printf("%d ",p->data); //输出第i个结点的数据域
p=p->next;//p指向下一个结点
i++;
}
printf("\n");
printf("链表长度为:%d\n",i);
}
主函数:
输入项要创建的单链表长度及链表元素,然后通过序号选择想要对链表进行的操作(插入,修改,删除,查找元素),每一项操作的最后都会输出链表被操作之后的元素及长度。