C语言数据结构双向链表的操作集

来源:互联网 发布:人力资源软件发展趋势 编辑:程序博客网 时间:2024/04/30 19:05
#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct DuLNode{
ElemType data;
struct DuLNode *next;
struct DuLNode *prior;
}DuLNode,*Dulinklist;


DuLNode* createdulist()
{
DuLNode *p,*h,*l;
int i,n;
h=(DuLNode *)malloc(sizeof(DuLNode));
h->prior=h;
h->next=h;
p=h;
printf("请输入建立双向链表的长度:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{

l=(DuLNode *)malloc(sizeof(DuLNode));
scanf("%d",&l->data);
p->next =l;
l->prior=p;
l->next =h;
h->prior =l;
p=l;
}
return (h);
}




void print(Dulinklist &L)
{
Dulinklist p;
p=L;
p=L->next;
printf("这个双链表所有元素为:\n");
    while(p!=L)
{
     printf("%-3d",p->data);
p=p->next;
}
}


int getdulist(Dulinklist &L,int i)
{
int e,j;
Dulinklist p;
p=L->next;
j=1;
while(p!=L&&j<i)
{
p=p->next;
++j;
}
if(p==L||j>i) 
printf("木有找到啊大兄弟!\n");
e=p->data;
return e;
}


DuLNode *insertdulist(Dulinklist &L,int i,ElemType e)

Dulinklist p,s;
int j;
p=L->next;
for(j=1;j<i;j++)
p=p->next;
s=(Dulinklist)malloc(sizeof(DuLNode));
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
return L;
}
DuLNode *deletedulist(Dulinklist &L,int i)
{
Dulinklist p;
int j,e;
p=L->next;
for(j=1;j<i;j++)
p=p->next;
e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
printf("删除第%d个数的数值为%d\n",i,e);
return L;
}










int searchdulist(Dulinklist &L,int e)
{
int i=0;
Dulinklist p;
p=L->next;
while(p!=L)
{
i++;
if(e==p->data)
printf("第%d个数与之对应\n",i);
p=p->next;
}
return 0;
}


void printbehind(Dulinklist &L,int i)
{
Dulinklist p;
int j=0;
p=L;
p=L->next;
while(p!=L)
{
j++;
if(j>i)
printf("%-3d",p->data);
p=p->next;
}
printf("\n");
}


void printfront(Dulinklist &L,int i)
{
Dulinklist p;
int j=0;
p=L;
p=L->next;
while(p!=L)
{
j++;
if(j<i)
printf("%-3d",p->data);
p=p->next;
}
printf("\n");
}


Dulinklist  dulinklist(Dulinklist &L,Dulinklist &Lb)
{
Dulinklist s,q,p;
p=L->prior;
q=Lb->next;
while(q!=Lb)
{
s=(Dulinklist)malloc(sizeof(DuLNode));
s->data=q->data;
s->prior=p;
s->next=L;
   p->next=s;
L->prior=s;
p=s;
q=q->next;
}
return L;
}













int main()
{
Dulinklist l,b,c;
int choice,n,e;
int i;
printf("输入1是创建列表并打印\n输入2是查找第几位元素的数值\n输入3是在什么位置插入什么数值\n输入4遍历元素在其中的位置\n输入5是输入第i位后面的数列\n输入6是输出第i位前面的数列\n输入7是删除第几个数并打印\n输入8是再创建一个列表连接并打印***********正在等待用户输入。。。。。。。\n");
while(scanf("%d",&choice)!=EOF)
{
if(choice==1)
{
l=createdulist();
print(l);
}


if(choice==2)
{
printf("请输入查找第几位数!\n");
scanf("%d",&i);
e=getdulist(l,i);
printf("第%d个元素为%d!\n",i,e);
}
if(choice==3)
{
printf("请输入在什么位置插入什么数:\n");
scanf("%d %d",&i,&e);
insertdulist(l,i,e);
print(l);
}
if(choice==4)
{
printf("请输入查询元素没有则不显示:\n");
scanf("%d",&e);
searchdulist(l,e);
}
if(choice==5)
{
printf("请输入i的数值:\n");
scanf("%d",&i);
printbehind(l,i);
}
if(choice==6)
{
printf("请输入i的数值:\n");
scanf("%d",&i);
printfront(l,i);
}
        if(choice==7)
{
printf("请输入要删除第几个数:\n");
scanf("%d",&i);
deletedulist(l,i);
print(l);
}
if(choice==8)
{
printf("创建一个新的双向循环链表连接打印:\n");
b=createdulist();
dulinklist(l,b);
print(l);
}
      printf("\n************正在等待用户输入*************\n");

}
return 0;
}
原创粉丝点击