要求:
源代码:
1.双向链表按任意位置插入
DoubleLink insert_next(DoubleLink head,char element,int pos)
{
int len=list_length(head);
if(pos<1 || pos>len+1)
{
return head;
}
else if(pos==1)
{
DoubleLink s=create();
s->data=element;
head=insert_head(head,element);
return head;
}
else
{
DoubleLink p=head;
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
DoubleLink s=create();
s->data=element;
s->next=p->next;
p->next=s;
}
return head;
}
效果图:
2.双向链表按任意位置删除
DoubleLink delete_next(DoubleLink head,int pos)
{
if(NULL==head)
return NULL;
int len=list_length(head);
if(pos<1 || pos>len)
{
printf("Pos is error\n");
return head;
}
else if(pos==1)
{
head=delete_head(head);
return head;
}
else
{
DoubleLink p=head;
for(int i=1;i<pos -1 ;i++)
{
p=p->next;
}
DoubleLink s=p->next;
p->next=s->next;
free(s);
s=NULL;
return head;
}
}
效果图:
3.主函数main.c
#include"head.h"
int main(int argc,char *argv[])
{
DoubleLink head=NULL;
int n;
datatype element;
printf("please enter n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("please enter %d element:",i+1);
scanf(" %c",&element);
//head=insert_head(head,element);
head =insert_rear(head,element);
}
output(head);
puts("");
//head=delete_head(head);
//head=delete_rear(head);
//output(head);
int pos;
// printf("please enter insert_pos:");
// scanf("%d",&pos);
// printf("please enter element");
// scanf(" %c",&element);
// head=insert_next( head, element, pos );
// output(head);
printf("please enter delete_pos:");
scanf("%d",&pos);
head=delete_next( head, pos );
output(head);
return 0;
}
4.功能函数test.c
#include"head.h"
DoubleLink create()
{
DoubleLink s=(DoubleLink)malloc(sizeof(struct Node));
if(s==NULL)
return NULL;
s->data=0;
s->next=NULL;
s->prev=NULL;
return s;
}
void output(DoubleLink head)
{
if(NULL==head)
{
printf("DoubleList is empty!\n");
return;
}
DoubleLink p=head;
//反向输出
while(p->next!=NULL)
{
printf("%-5c",p->data);
p=p->next;
}
printf("%-5c ",p->data);
puts("");
//正向输出
// while(p!=NULL)
// {
// printf("%-5c",p->data);
// p=p->prev;
// }
// puts("");
}
DoubleLink insert_head(DoubleLink head , datatype element)
{
DoubleLink s=create();
s->data=element;
if(NULL==head)
head=s;
else
{
s->next=head;
head->prev=s;
head=s;
}
return head;
}
DoubleLink insert_rear(DoubleLink head , datatype element)
{
DoubleLink s=create();
s->data=element;
if(NULL==head)
head=s;
else
{
DoubleLink p =head;
while(p->next!=NULL)
{
p=p->next;
}
p->next=s;
s->prev=p;
}
return head;
}
DoubleLink delete_head(DoubleLink head)
{
if(NULL==head)
return NULL;
else if(head->next==head->prev)
{
free(head);
head=NULL;
return head;
}
DoubleLink del=head;
head=head->next;
head->prev=NULL;
free(del);
del=NULL;
return head;
}
DoubleLink delete_rear(DoubleLink head)
{
if(NULL==head)
return NULL;
else if(head->next==head->prev)
{
free(head);
head=NULL;
return head;
}
DoubleLink p=head;
while(p->next!=NULL)
{
p=p->next;
}
DoubleLink del=p;
p->prev->next=NULL;
free(del);
del=NULL;
return head;
}
int list_length(DoubleLink head)
{
int len=0;
DoubleLink p=head;
while(p!=NULL)
{
p=p->next;
len++;
}
return len;
}
DoubleLink insert_next(DoubleLink head,char element,int pos)
{
int len=list_length(head);
if(pos<1 || pos>len+1)
{
return head;
}
else if(pos==1)
{
DoubleLink s=create();
s->data=element;
head=insert_head(head,element);
return head;
}
else
{
DoubleLink p=head;
for(int i=1;i<pos-1;i++)
{
p=p->next;
}
DoubleLink s=create();
s->data=element;
s->next=p->next;
p->next=s;
}
return head;
}
DoubleLink delete_next(DoubleLink head,int pos)
{
if(NULL==head)
return NULL;
int len=list_length(head);
if(pos<1 || pos>len)
{
printf("Pos is error\n");
return head;
}
else if(pos==1)
{
head=delete_head(head);
return head;
}
else
{
DoubleLink p=head;
for(int i=1;i<pos -1 ;i++)
{
p=p->next;
}
DoubleLink s=p->next;
p->next=s->next;
free(s);
s=NULL;
return head;
}
}
5.头文件head.h
#ifndef _HEAD_H__
#define _HEAD_H__
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//定义双向链表结构体
typedef char datatype ;
typedef struct Node
{
/* data */
datatype data;
struct Node *next;
struct Node *prev;
}*DoubleLink;
void output(DoubleLink head);
DoubleLink insert_head(DoubleLink head , datatype element);
DoubleLink insert_rear(DoubleLink head , datatype element);
DoubleLink delete_head(DoubleLink head);
DoubleLink delete_rear(DoubleLink head);
DoubleLink insert_next(DoubleLink head,char element,int pos);
DoubleLink delete_next(DoubleLink head,int pos);
#endif
思维导图: