1、整理思维导图
2、整理课上单向循环链表的代码
3、完成双向链表的剩下四个功能
2、
node_p create_list()//创建链表
{
node_p p=(node_p)malloc(sizeof(node));
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->len=0;
p->next=p;
return p;
}
node_p create_node(datatype data)//申请结点
{
node_p p=(node_p)malloc(sizeof(node));
if(p==NULL)
{
printf("申请失败\n");
return NULL;
}
p->data=data;
return p;
}
int empty_list(node_p p)//判空
{
if(p==NULL)
return -1;
return p->len==0;
}
void insert_head(node_p p,datatype data)//头插
{
if(p==NULL)
return;
node_p q=create_node(data);
p->next=q;
p->len++;
}
void dele_head(node_p p,datatype data)//头删
{
if(p==NULL||empty_list(p))
return;
node_p q=p->next;
p->next=q->next;
free(q);
q=NULL;
p->len--;
}
void insert_tail(node_p p,datatype data)//尾插
{
if(p==NULL)
return;
node_p q=p;
while(p->next!=q)
{
p=p->next;
}
p->next=create_node(data);
q->len++;
}
void dele_tail(node_p p)//尾删
{
if(p==NULL||empty_list(p))
return;
node_p q=p;
while(p->next->next!=q)
{
p=p->next;
}
free(p->next);
p->next=q;
q->len--;
}
void insert_pos(node_p p,datatype data,int pos)//按位置插入
{
if(p==NULL||pos<0||pos>p->len-1)
return;
node_p q=p;
for(int i=0;i<pos;i++)
{
p=p->next;
}
node_p r=p->next;
p->next=create_node(data);
p->next->next=r;
q->len++;
}
void dele_pos(node_p p,int pos)//按位置删除
{
if(p==NULL||empty_list(p)||pos<0||pos>p->len-1)
return;
node_p q=p;
node_p r=p->next->next;
for(int i=0;i<pos;i++)
{
p=p->next;
}
free(p->next);
p->next=r;
q->len--;
}
void show_list(node_p p)//输出
{
if(p==NULL||empty_list(p))
return;
node_p q=p;
p=p->next;
while(p->next!=q)
{
printf("%d->",p->data);
p=p->next;
}
}
node_p DeleHead(node_p p)//删除头结点
{
if(p==NULL)
return NULL;
node_p q=p;
while(p->next!=q)
{
p=p->next;
}
p->next=q->next;
free(q);
q=NULL;
return p->next;
}
void show_nohead_list(node_p p)//输出无头结点的链表
{
node_p q=p;
do{
printf("%d->",p->data);
p=p->next;
}while(p!=q);
}
3、