一、普通双链题目
typedef struct Nood
{
union
{
int len;
int data;
};
struct Nood *Prev;
struct Nood *Next;
}*db_link;
db_link creat(int flag);//建立
int insertwei(db_link L,int m);//尾插
void disp(db_link L);//显示
void delewei(db_link L,int x);//按位删除
void updatewei(db_link L,int x,int m);//按位修改x位改位m
void serchwei(db_link L,int x);//按位查找
int main()
{
int n;
int i;
int x;
db_link L=creat(0);
printf("请输入要插入的元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
insertwei(L,x);
}
disp(L);
printf("请输入要删除第几个数:");
scanf("%d",&n);
delewei(L,n);
disp(L);
printf("请输入要改的位置及要改成的数");
scanf("%d %d",&n,&i);
updatewei(L,n,i);
disp(L);
printf("请输入要查找的位次");
scanf("%d",&x);
serchwei(L,x);
return 0;
}
db_link creat(int flag)
{
db_link L=(db_link)malloc(sizeof(db_link));
if(flag==0)
L->len=0;
else
L->data=0;
L->Prev=NULL;
L->Next=NULL;
return L;
};
int insertwei(db_link L,int m)
{
db_link s=creat(0);
if(s==NULL)
return -1;
db_link p=L;
while(p->Next != NULL)
p=p->Next;
s->data=m;
p->Next=s;
s->Prev=p;
L->len++;
return 0;
}
void disp(db_link L)
{
if(L==NULL || L->len==0)
return;
db_link p=L;
while(p->Next != NULL)
{
printf("%d\t",p->Next->data);
p=p->Next;
}
printf("\n");
}
void delewei(db_link L,int x)
{
if(L==NULL || L->len==0 || x<1 || x>L->len)
{
puts("删除不成功");
return;
}
db_link p=L;
for(int i=0;i<x;i++)
p=p->Next;
p->Prev->Next=p->Next;
if(p->Next != NULL)
p->Next->Prev=p->Prev;
free(p);
p=NULL;
L->len--;
}
void updatewei(db_link L,int x,int m)
{
if(L==NULL || L->len==0 || x<1 || x>L->len)
{
puts("修改失败");
return;
}
db_link p=L;
for(int i=0;i<x;i++)
{
p=p->Next;
}
p->data=m;
}
void serchwei(db_link L,int x)
{
if(L==NULL || x<1 || x>L->len || L->len==0)
{
puts("查找失败");
return;
}
db_link p=L;
for(int i=0;i<x;i++)
{
p=p->Next;
}
printf("第%d位数位 %d\n",x,p->data);
}
二、循环双链
#include <stdio.h>
#include <stdlib.h>
typedef struct Nood
{
union
{
int len;
int data;
};
struct Nood *Prev;
struct Nood *Next;
}*db_link;
db_link creat(int flag);//建立
int insertwei(db_link L,int m);//尾插
void disp(db_link L);//输出
void delewei(db_link L);//尾删
void inserthead(db_link L,int m);//头插
void delehead(db_link L);//头删
int main()
{
int n;
int i;
int x;
db_link L=creat(0);
printf("请输入要尾部插入的元素个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
insertwei(L,x);
}
disp(L);
printf("尾部删除一个试试\n");
delewei(L);
disp(L);
printf("请输入要头部插入的元素个数:");
scanf("%d",&n);
printf("请输入要插入的元素\n");
for(i=0;i<n;i++)
{
scanf("%d",&x);
inserthead(L,x);
}
disp(L);
printf("头部删除一个试试\n");
delehead(L);
disp(L);
return 0;
}
db_link creat(int flag)
{
db_link L=(db_link)malloc(sizeof(db_link));
if(flag==0)
L->len=0;
else
L->data=0;
L->Prev=L;
L->Next=L;
return L;
};
int insertwei(db_link L,int m)
{
if(L==NULL)
return -1;
db_link s=creat(0);
db_link p=L;
while(p->Next != L)
p=p->Next;
s->data=m;
s->Next=L;
s->Prev=p;
p->Next=s;
L->Prev=s;
L->len++;
return 0;
}
void disp(db_link L)
{
if(L==NULL)
return;
db_link p=L;
while(p->Next != L)
{
printf("%d\t",p->Next->data);
p=p->Next;
}
printf("\n");
}
void delewei(db_link L)
{
if(L==NULL || L->len==0 )
{
puts("删除不成功");
return;
}
db_link p=L->Prev;
p->Prev->Next=L;
L->Prev=p;
free(p);
L->len--;
}
void inserthead(db_link L,int m)
{
if(L==NULL)
{
puts("前面插入失败");
return;
}
db_link s=creat(0);
s->data=m;
s->Next=L->Next;
s->Prev=L;
L->Next=s;
L->Next->Prev=s;
L->len++;
}
void delehead(db_link L)
{
if(L==NULL || L->len==0)
{
puts("删除失败");
return;
}
db_link p=L->Next;
p->Next=L->Next;
p->Next->Prev=L;
L->len--;
}