#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node*next,*prior;
}Snode;
Snode* creat()//创建头结点
{
int n,i,x;
Snode *head,*s,*t;
head=(Snode*)malloc(sizeof(Snode));
head->next=NULL;
head->prior=NULL;
t=head;
printf("请输入要插入的结点数:\n");
scanf("%d",&n);
if(n!=0)
{
printf("请输入%d个结点数的值\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&x);
s=(Snode*)malloc(sizeof(Snode));
s->data=x;
s->next=t->next;
s->prior=t;
t->next=s;
t=s;
}
}
return head;
}
int lenth(Snode *l)//求链表的长度
{
int len=0;
Snode *s=l;
while(s!=NULL)
{
len++;
s=s->next;
}
return len;
}
Snode *get(Snode *l,int i)//取单链表表中第i个结点地址
{
int len=0;
Snode *s=l;
while(s!=NULL&&len!=i)
{
len++;
s=s->next;
}
return s;
}
void insnode(Snode *l,int i,int x)//把x的值插入到指定的位置i
{
Snode *s,*t;
if(i<=lenth(l))
{
s=(Snode*)malloc(sizeof(Snode));
s->data=x;
t=get(l,i-1);
s->next=t->next;
s->prior=t;
t->next->prior=s;
t->next=s;
}
else printf("链表中没有第%d个位置\n",i);
}
void delnode(Snode *l,int i)//删除指定位置i的结点
{
Snode *s,*t;
if(i<=lenth(l))
{
t=get(l,i-1);
s=t->next;
t->next=s->next;
if(i!=lenth(l))
s->next->prior=t;
free(s);
}
else printf("链表中没有第%d个位置\n",i);
}
int locate(Snode *l,int x)//按值查找
{
int flag=-1;
Snode *s=l;
while(s!=NULL)
{
if(s->data==x)
{
flag=1;
break;
}
else s=s->next;
}
return flag;
}
void display(Snode *l)//显示链表
{
Snode *s=l->next;
while(s!=NULL)
{
printf("%d ",s->data);
s=s->next;
}
printf("\n");
}
int main()
{
Snode *s;
int i,x;
char c;
while(1)
{
printf("************************\n");
printf("* *\n");
printf("* 1 链表初始化 *\n");
printf("* 2 链表指定插入 *\n");
printf("* 3 链表指定删除 *\n");
printf("* 4 链表按值查询 *\n");
printf("* 5 退出 *\n");
printf("************************\n");
c=getchar();
if(c=='5')break;
else
switch(c)
{
case '1':s=creat();;
printf("初始化后的链表:\n");
display(s);
break;
case '2':printf("请输入要插入的位置和值\n");
scanf("%d%d",&i,&x);
insnode(s,i,x);
printf("插入指定位置值后的链表:\n");
display(s);
break;
case '3':printf("请输入要删除的位置\n");
scanf("%d",&i);
delnode(s,i);
printf("删除指定位置值后的链表:\n");
display(s);
break;
case '4':printf("请输入要按值查询的值\n");
scanf("%d",&x);
if(locate(s,x)!=-1)
printf("在链表中查到了\n");
else
printf("没有查到\n");
break;
}
getchar();
}
return 0;
}
双链表
最新推荐文章于 2022-10-23 23:25:03 发布