双向链表头删
双向链表尾删
双向链表按位置插入
双向链表按位置修改
双向链表按位置删除
双向链表按位置查找
头
#ifndef __HEAD_H__
#define __HEAD_H__
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef char datatype[20];
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *front;
struct node *next;
}*double_list;
double_list create_head();
double_list create_node();
int insert_head(double_list l,datatype e);
void output_doublelist(double_list l);
int insert_rear(double_list l,datatype e);
int delete_head(double_list l);
int delete_rear(double_list l);
int insert_sub(double_list l,int sub,datatype e);
int change_sub(double_list l,int sub,datatype e);
int delete_sub(double_list l,int sub);
int search_sub(double_list l,int sub);
#endif
自定义函数
#include "head.h"
double_list create_head()
{
double_list l =(double_list)malloc(sizeof(struct node));
if(l==NULL)
return NULL;
l->len = 0;
l->front=NULL;
l->next=NULL;
return l;
}
double_list create_node()
{
double_list p=(double_list)malloc(sizeof(struct node));
if(p==NULL)
return NULL;
strcpy(p->data,"");
p->front=NULL;
p->next=NULL;
return p;
}
int insert_head(double_list l,datatype e)
{
if(l==NULL)
{
printf("头插失败");
return -1;
}
//创建新结点s
double_list s= create_node();
strcpy(s->data,e);
s->next=l->next;
s->front=l;
if(l->next!=NULL)
l->next->front=s;
l->next=s;
l->len++;
return 0;
}
void output_doublelist(double_list l)
{
if(l==NULL||l->len==0)
{
printf("遍历失败");
return;
}
double_list p=l;
while(p->next!=NULL)
{
p=p->next;
printf("%s\t",p->data);
}
/*while(p->front!=NULL)
{
printf("%s\t",p->data);
p=p->front;
}*/
puts("");
}
int insert_rear(double_list l,datatype e)
{
if(l==NULL)
{
printf("尾插失败");
return -1;
}
double_list p=l;
while(p->next!=NULL)
{
p=p->next;
}
double_list s=create_node();
if(s==NULL)
{
printf("尾插失败");
return -1;
}
strcpy(s->data,e);
p->next=s;
s->front=p;
l->len++;
return 0;
}
int delete_head(double_list l)
{
if(l==NULL||l->len==0)
{
printf("头部删除失败");
return -1;
}
double_list q=l->next;
l->next=q->next;
if(q->next!=NULL)
{
q->next->front=l;
}
free(q);
q=NULL;
l->len--;
return 0;
}
int delete_rear(double_list l)
{
if(l==NULL||l->len==0)
{
printf("尾删失败");
return -1;
}
double_list p=l;
for(int i=0;i<l->len;i++)
{
p=p->next;
}
p->front->next=NULL;
free(p);
p=NULL;
return 0;
}
int insert_sub(double_list l,int sub,datatype e)
{
if(l==NULL||sub>l->len+1||sub<1)
{
printf("按位置插入失败");
return -1;
}
double_list p=l;
for(int i=0;i<sub;i++)
{
p=p->next;
}
double_list s=create_node();
if(s==NULL)
{
printf("按位置插入失败");
return -1;
}
s->next=p;
s->front=p->front;
p->front->next=s;
p->front=s;
strcpy(s->data,e);
return 0;
}
int change_sub(double_list l,int sub,datatype e)
{
if(l==NULL||l->len==0||sub>l->len||sub<1)
{
printf("按位置修改失败");
return -1;
}
double_list p=l;
for(int i=0;i<sub;i++)
{
p=p->next;
}
strcpy(p->data,e);
return 0;
}
int delete_sub(double_list l,int sub)
{
if(l==NULL||l->len==0||sub<1||sub>l->len)
{
printf("按位置删除失败");
return -1;
}
double_list p=l;
for(int i=0;i<sub-1;i++)
{
p=p->next;
}
double_list q=p->next;
p->next=q->next;
if(q->next!=NULL)
q->next->front =p;
free(q);
q=NULL;
l->len--;
return 0;
}
int search_sub(double_list l,int sub)
{
if(l==NULL||l->len==0||sub<1||sub>l->len)
{
printf("按位置查找失败");
return -1;
}
double_list p=l;
for(int i=0;i<sub;i++)
{
p=p->next;
}
printf("查找的字符串为%s\n",p->data);
return 0;
}
主函数
#include "head.h"
int main(int argc, const char *argv[])
{
double_list l=create_head();
int n;datatype e;
/* printf("请输入要插入字符串的个数");
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
printf("请输入字符串");
// gets(e);
scanf(" %s", e);
insert_head(l,e);
}
output_doublelist(l);*/
printf("请输入要插入字符串的个数");
scanf("%d",&n);
int j=0;
while(j<n)
{
printf("请输入字符串");
scanf("%s",e);
insert_rear(l,e);
j++;
}
output_doublelist(l);
delete_head(l);
output_doublelist(l);
delete_rear(l);
output_doublelist(l);
int sub;
printf("请输入要插入的位置");
scanf("%d",&sub);
printf("请输入要插入的值");
scanf("%s",e);
insert_sub(l,sub,e);
output_doublelist(l);
printf("请输入要修改的位置");
scanf("%d",&sub);
printf("请输入要修改值");
scanf("%s",e);
change_sub(l,sub,e);
output_doublelist(l);
printf("请输入要删除的位置");
scanf("%d",&sub);
delete_sub(l,sub);
output_doublelist(l);
printf("请输入要查找的位置");
scanf("%d",&sub);
search_sub(l,sub);
return 0;
}