双向循环链表的创建,插入与删除。
2013-08-02 22:20
302 查看
#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);
}
#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);
}
相关文章推荐
- 双向循环链表的创建,插入,删除操作
- 双向循环链表的创建、插入、删除、求长、查询、打印、修改、清空、销毁
- 双向循环链表(创建·插入·删除·遍历)
- 双向循环链表的创建修改插入删除操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 单链表,双向链表的插入,查询,创建,删除,输出
- 循环链表 实现对循环链表的初始化,创建,插入,删除,输出操作
- 用c语言完成一个双向链表的创建,插入,删除
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作
- 双向链表 C语言 (创建,插入,删除,判空,返回链表长度)
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
- 约瑟夫问题--双向循环链表的创建与删除
- 双向链表的创建、打印、求长、插入、删除、查值、清空、销毁
- 循环链表的创建、插入、删除、逆序、显示(C++实现)
- 循环链表的创建、插入、删除、逆序、显示(C++实现)
- 双向链表的有关操作(创建,遍历,插入,删除)
- 双向循环链表简单的插入、删除、修改以及查找功能的实现