链表的创立过程,其实即位小朋友玩的“手拉手”游戏,你拉着我,我拉着你,这样循环下去。
链表的创立:--数据类型
这里以‘#’来表示结束
Node * CreateList()
{
Node *temp,*p;
p=(Node*)malloc(sizeof(Node));
temp=p;
p->pro=NULL;
while(p->data!='#')
{
Node *s=(Node *)malloc(sizeof(Node));
p->next=s;
s->pro=p;
scanf("%c",&s->data);
p=s;
}
p->next=NULL;
return temp;
}
//查找一个双向链表的值,返回该节点,
Node * find(Node *s,Element c)
{
Node* p=s->next;
if(p==NULL)
returnNULL;
while(p->data!=c)
{
p=p->next;
}
return p;
}
//打印双向链表的值到屏幕当中来
void ListPrint(Node *p)
{
Node *s=p->next;
while(s->data!='#')
{
printf("%c ",s->data);
s=s->next;
}
}
//计算长度
int LengthList(Node *p)
{
int length=0;
Node *s=p->next;
while(s->data!='#')
{
s=s->next;
length++;
}
s->next=NULL;
return length/2;
}
Node * proList(Node *p,Element c)
{
Node* s=p->next;
if(s==NULL)
returnNULL;
if(s->data==c)
{
s=p;
}
while (s->next->data!=c) {
s=s->next;
}
return s;
}
//删除双向链表中一个值
Node* deleteOneDataList(Node*p,Element c)
{
Node *head=p;
p=p->next;
while(p->next->data!=c)
{
p=p->next;
}
Node *d=p->next;
Node *temp=p->next->next;
p->next=temp;
temp->pro=p;
free(d);
return head;
}
//双向链表插入一个值在指定的位置
Node* insert(Node *p,int a,Element d)
{
int local=0;
Node *head=p;
Node *pro;
Node *next;
Node *da=(Node *)malloc(sizeof(Node));
da->data=d;
p=p->next;
if(a==LengthList(p)||a>LengthList(p))
{
while(p->data!='#')
{
p=p->next;
}
p->next=da;
da->pro=p;
da->next=NULL;
}
else
{
while(local/2!=a-1)
{
p=p->next;
local++;
}
pro=p;
next=p->next;
da->next=next;
next->pro=da;
pro->next=da;
da->pro=pro;
}
return head;
}
这里只是一个简单测试下:学生正在学习的道路上,希望大家指出错误。