双向循环链表的创建,插入与删除。

#include<stdio.h>
#include<malloc.h>
//=============================
//线性表的双向链表存储结构
//=============================
typedef int ElemType;
typedef int Status;
typedef struct DuLNode
{
   ElemType  data;
   struct DuLNode *prior;
   struct DuLNode *next;
}DuLNode,*DuLinkList;
//============================
//链表的长度
//============================
int length(DuLinkList l)
{
int i=0;
DuLinkList  p;
p=l->next;
while(p!=l)
{
i++;
p=p->next;
}
return i;
}
//============================
//创建双向循环链表
//============================
DuLinkList create(DuLinkList  l)
{
int i,n;
DuLinkList  newbase;
printf("请输入双向循环链表结点的个数:");
scanf("%d",&n);
l=(DuLinkList)malloc(sizeof(DuLNode));
if(!l)
printf("内存分配失败!!!\n");
l->prior=l->next=l;
for(i=1;i<=n;i++)
{
newbase=(DuLinkList)malloc(sizeof(DuLNode));
printf("请输入第%d个结点的值:\n",i);
scanf("%d",&newbase->data);
newbase->prior=l;
newbase->next=l->next;
l->next->prior=newbase;
l->next=newbase;
}
return l;
}
//============================
//(正序输出)打印函数
//============================
void print1(DuLinkList l)
{
DuLinkList  p;
p=l->next;
printf("双向循环链表的链表结点值是:\n");
while(p!=l)
{
printf("%d\t",p->data);
p=p->next;
}
}
//============================
//(逆序输出)打印函数
//============================
void print2(DuLinkList l)
{
DuLinkList  p;
p=l->prior;
printf("双向循环链表的链表结点值是:\n");
while(p!=l)
{
printf("%d\t",p->data);
p=p->prior;
}
}
//=============================
//在第i个位置之前插入元素e
//=============================
DuLinkList ListInsert(DuLinkList l,int i,ElemType e)
{
int m;
  DuLinkList newbase,p; 
  p=l;
  if(i<1||i>length(l))
 printf("你输入的结点位置错误!!!\n");
  else
  {
  newbase=(DuLinkList)malloc(sizeof(DuLNode));
  if(!newbase)
 printf("内存分配失败!!!\n");
  for(m=1;m<=i;m++)
  {
 p=p->next;
  }


  if(i==1)
  {
 newbase->data=e;
 newbase->next=l;
 newbase->prior=l->prior;
 l->prior=newbase;
 l->prior->next=newbase;
  }
  else
  {
 newbase->data=e;
 newbase->prior=p->prior;
 p->prior->next=newbase;
 newbase->next=p;
 p->prior=newbase;
  }
  }
return l;
}
//=============================
//删除函数
//=============================
DuLinkList  ListDelete(DuLinkList l,int i,ElemType &e)
{
  int m;
  DuLinkList p; 
  p=l;
  if(i<1||i>length(l))
 printf("你输入的结点位置错误!!!\n");
  for(m=1;m<=i;m++)
  {
 p=p->next;
  }
  e=p->data;
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);
  return l;
}
//=============================
//主函数
//=============================
void main()
{
int i,j,m,n,c;
DuLinkList head,l;
do{
printf("\n=======================================\n");
printf("\n1.创建双向循环链表\n");
printf("\n2.插入元素\n");
printf("\n3.删除元素\n");
printf("\n4.退出\n");
printf("\n=======================================\n");
printf("请选择你要操作的序号:\n");
scanf("%d",&c);
  switch(c)
  {
  case 1:
 {
head=create(l);
printf("\n正序输出:\n");
print1(head);
printf("\n逆序输出\n");
print2(head);
break;
 }
  case 2:
 {
    printf("\n请输入你要插入的元素的位置及元素的值:\n");
   scanf("%d%d",&i,&j);
    head=ListInsert(head,i,j);
    print1(head);
break;
 }
  case 3:
 {
printf("\n请输入你要删除的元素的位置:\n");
scanf("%d",&m);
ListDelete(head,m,n);
printf("\n你要删除的元素是:%d\n",n);
print1(head);
        break;
 }
  case 4:
 {
   c=0;
   break;
 }
  default :
 {
printf("对不起,您输入的选项有误,请重新输入:\n");
break;
 }
  }

}
while(c!=0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值