线性表的链式存储实验
while(p!=NULL && j<pe-1)
{
p = p->next;
j++;
}
if(p==NULL)
{
printf("插入的位置超过合法范围\n");
exit(0);
}
else if(pe==1)
{
q = (Link *)malloc(sizeof(Link));
if(q==NULL)
{
printf("空间不足,节点申请失败!\n");
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
break;
case 2:
printf("1按序号查找\n2按值查找\n");
while(m=='y')
{
printf(#34;%d",&chioce);
}
q->data = e;
q->next = p;
head->next = q;
}
else
{
q = (Link *)malloc(sizeof(Link));
if(q==NULL)
{
printf("空间不足,节点申请失败!\n");
exit(0);
}
q->data = e;
q->next = p->next;
实验报告
学号:****************年**月**日
系别
***
专业
**
班级
1班
姓名
****
课程名称
数据结构
课程类型
专业必修
学时数
2
实验名称
线性表的链式存储实验
实验目的和要求:
(1)掌握用在VC环境下上机调试单链表的基本方法
(2)掌握单链表、循环链表的插入、删除、查找、求表长以及有序单链表的合并算法的实现
{
printf("次链表为空!请先创建链表\n");
exit(0);
}
while(p!=NULL && i<k)
{
p = p->next;
i++;
}
if(p==NULL)
{
printf("输入序号超过表长!\n");
exit(0);
}
else
printf("第%d个元素为%d\n",k,p->data);
scanf(" %c",&m);
}
break;
case 3:
printf("输入插入的数值:");
scanf("%d",&e);
printf("输入节点的位置:");
scanf("%d",&pe);
Insert_elem(head,pe,e);
break;
case 4:
printf("1按位置删除\n2按值删除\n3删除链表中所有的重复元素\n");
p->next = q;
}
printf("插入新节点后的链表为:\n");
p = head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
//删除元素
void Delete(Link *head,int chioce)
{
int k,j=1;
while(1)
{
printf("请选择要执行的操作:");
scanf("%d",&chioce);
Delete(head,chioce);
printf("\n是否继续操作(y/n):");
scanf(" %c",&c);
if(c=='n')
break;
}
break;
case 5:
printf("\n创建第一个列表\n");
exit(0);
break;
}
}while(pick!=0);
}
运算结果:
二、循环链表的基本操作
源代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct link
{
int data;
struct link *next;
}Link;
//创建链表并初始化
scanf(" %c",&c);//注意吸收回车符
getchar();
while(c=='y')
{
i++;
headLb = Create_link(headLb);
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c);//吸收回车符可以在scanf后加入多个空格
}
p = headLb->next;
}
else
{
printf("%d在第%d个位置且地址为%d\n",key,i,p);
}
}
//将e插入链表的第pe个位置
void Insert_elem(Link *head,int pe,int e)
{
Link *q = NULL;//q用于申请新节点
Link *p = head->next;
int j=1;
p->next = NULL;
printf("请输入该结点的数据:");
scanf("%d",&(p->data));
}
return head;
}
//在链表中按序号查找
void Insert_link(Link *head,int k)
{
int i=1;
Link *p = head->next;
if(head==NULL)
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c); //注意吸收在选择时的回车符
getchar();
while(c=='y')
{
i++;
headLa = Create_link(headLa);
printf("是否要创建新的节点(y/n):");
scanf(" %c",&c);
int chioce,pick;
int e,pe;
printf("1创建链表\n2链表的查找\n3链表的插入\n4链表的删除\n5两链表的合并\n6退出操作\n");
do{
printf("\n选择:");
scanf("%d",&pick);
switch(pick)
{
case 1:
printf("是否要创建新的节点(y/n):");
Link *ptr =NULL;
while(pa && pb)
{
if(pa->data < pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else if(pa->data > pb->data)
{
pc->next = pb;
pc = pb;
pb = pb->next;
printf("共创建%d个节点\n链表为:\n",i);
while(p!=NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
printf("\n合并后的链表为\n");
Merge(headLa,headLb);
break;
case 0:
printf("退出操作!\n");
switch(chioce)
{
case 1:
printf("输入序号:");
scanf("%d",&k);
Insert_link(head,k,i);
break;
case 2:
printf("输入元素值:");
scanf("%d",&key);
Find_elem(head,key);
break;
}
printf("是否继续查找(输入y/n):");
if(p==NULL)
{
printf("没有足够的空间!\n");
exit(0);
}
if(head==NULL)
{
head = p;
p->next = NULL;