数据结构实验建立双向循环链表以及插入删除操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一
要求:①建立双向循环链表
②实现链表的插入、删除
运行程序点此处
实验程序源代码:
#include ""
#include<>
#include<>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef int status;
//双向循环链表的存储结构
typedef struct DuLNode
{
int data;
int Length;
struct DuLNode *prior;
struct DuLNode *next;
} DuLNode,*DuLinkList;
//构建一个空的双向循环链表
void InitList(DuLNode **p)
{
*p=(DuLNode *)malloc(sizeof(DuLNode));
if(*p)
{
(*p)->next=(*p)->prior=*p;
(*p)->Length=0;
}
else
exit(OVERFLOW);
}
//双向循环链表的创建
void Create(DuLinkList &L,int n)
{
//输入n个元素的值,建立带头结点的双线循环链表L DuLinkList p=L,q;
int i;
for(i=1;i<=n;i++)
{
q=(DuLinkList)malloc(sizeof(DuLNode));
printf("您该输入第%d个元素的值了:",i);
scanf("%d",&q->data);
p->next =q;
q->prior=p;
q->next=L;
L->prior =q;
p=q;
L->Length ++;
}
}
//查找元素的位置
DuLinkList GetElemP(DuLinkList h,int i)
{
int j;
DuLinkList p=h;
for(j=1;j<=i;j++)
p=p->next ;
return p;
}
//结点的插入
status Listinsert(DuLNode *m,int i,int e)
{
//在带头结点的双链循环线性表L中第i个位置之前插入元素e,i的合法值为1≤i≤表长
DuLinkList p,q;
if(i<1||i>(m->Length)) // i值不合法
return ERROR;
p=GetElemP(m,i);
if(!p)
return ERROR;
q=(DuLinkList)malloc(sizeof(DuLNode));
if(!q)
return OVERFLOW;
q->data=e;
q->prior=p->prior;
p->prior->next=q;
q->next=p;
p->prior=q;
m->Length++;
printf("您在双向循环链表第%d个位置之前插入了一结点元素:%d\n",i,e);
return OK;
}
//结点的删除
status ListDelete(DuLinkList L,int i)
{
//删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长
DuLinkList p;
if(i<1) /* i值不合法 */
return ERROR;
p=GetElemP(L,i);
if(!p)
return ERROR;
p->prior->next=p->next;
p->next->prior=p->prior;
L->Length --;
printf("删除了双线循环链表中第%d个结点,元素值为:%d\n",i,p->data); free(p);
return OK;
}
//结点的输出
void Display( DuLinkList L)
{ DuLinkList p;
printf("双向循环链表中的结点的数据为:");
for(p=L->next ;p->next !=L;)
{
printf("%d",p->data);
printf(" & ");
p=p->next ;
}
printf("%d\n",p->data );
}
//主函数实现链表的创建,插入,删除等操作
void main()
{
DuLinkList L;
int n,i;
InitList(&L) ;
printf("你想创建几个循环节点就输入几就行啦,请输入:");
scanf("%d",&n);
Create(L,n);
Listinsert(L,3,3);//结点的插入
printf("您想删除哪个结点呢");
scanf("%d",&i);
printf("您确定删除此结点吗1:YES 2:NO(回复数字确认)");
if(i=2)
{
printf("您想删除哪个结点呢");
scanf("%d",&i);
ListDelete(L,i);
}