一、双向链表
1.main.c
#include"head.h"
int main(int argc, char const *argv[])
{
double_linklist *L=creat(1);//1头节点 0普通节点
/*menue();*/
/*datatype e;
int n;
printf("输入插入的个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入头插的字符:");
scanf(" %c",&e);
insert_head(L,e);
}*/
//尾插
datatype a;int n;
printf("输入尾插的个数:");
scanf(" %d",&n);
for(int i=0;i<n;i++)
{
printf("输入尾插的字符:");
scanf(" %c",&a);
input_rear(L,a);
}
//输出
printf("输出结果:");
output(L);
//头删
/*delete_head(L);
output(L);*/
//尾删
/*delete_rear(L);
output(L);*/
//按位置插入
/*int pos; datatype f;
printf("输入按位置插入的位置:");
scanf("%d",&pos);
printf("输入插入的值:");
scanf(" %c",&f);
input_pos(L,f,pos);
output(L);*/
//按位置删除
/*int pos;
printf("输入要删除的位置:");
scanf("%d",&pos);
delete_pos(L,pos);
output(L);
puts("");*/
//按位置修改
/*datatype b;int pos;
printf("输入修改的位置:");
scanf("%d",&pos);
printf("输入按位置修改后的值:");
scanf(" %c",&b);
revise_pos(L,b,pos);
output(L);
puts("");*/
//按位置查找
int pos;
printf("输入要查找的位置:");
scanf("%d",&pos);
find_pos(L,pos);
puts("");
return 0;
}
2.text.c
#include"head.h"
double_linklist *creat(int flag)
{
double_linklist *L=(double_linklist *)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
//成功返回地址
if(flag==1)
{
L->len=0;
}
else if(flag==0)
{
L->data=0;
L->next=NULL;
L->prev=NULL;
}
return L;
}
//头插
int insert_head(double_linklist *L,datatype e)
{
//1,判断是否创建成功
if(L==NULL)
{
return -1;
}
//2,创建成功
double_linklist *s=creat(0);
if(s==NULL)
{
return -1;
}
s->data=e;
//指针域
s->next=L->next;
s->prev=L;
if(L->next!=NULL)
{
L->next->prev=s;
}
L->next=s;
L->len++;
return 0;
}
//尾插
int input_rear(double_linklist *L,datatype e)
{
if(L==NULL)
{
printf("尾插失败\n");
return -1;
}
double_linklist *p=L;
while(p->next!=NULL)
{
p=p->next;
}
double_linklist *s=creat(0);
s->data=e;
p->next=s;
s->prev=p;
L->len++;
return 0;
}
//输出
void output(double_linklist *L)
{
if(L==NULL||L->next==NULL)
{
printf("遍历失败\n");
return;
}
double_linklist *p=L;
puts("正向遍历:");
while(p->next!=NULL)
{
p=p->next;
printf(" %c",p->data);
}
puts("");
/*puts("反向遍历:");
while(p->prev!=NULL)
{
printf(" %c",p->data);
p=p->prev;
}
puts("");*/
}
//头部删除
int delete_head(double_linklist *L)
{
if(L==NULL||L->next==NULL)
{
printf("不需要头删\n");
return -1;
}
double_linklist *q=L;
q=L->next;
L->next=q->next;
if(q->next!=NULL)
{
q->next->prev=L;
}
free(q);
q=NULL;
L->len--;
printf("头删成功\n");
return 0;
}
//尾部删除
int delete_rear(double_linklist *L)
{
if(L==NULL||L->next==NULL)
{
printf("不需要头尾删\n");
return -1;
}
double_linklist *p=L;
while(p->next!=NULL)
{
p=p->next;
}
p->prev->next=NULL;
free(p);
p=NULL;
L->len--;
printf("尾删成功\n");
return 0;
}
//按位置插入
int input_pos(double_linklist *L,datatype f,int pos)
{
if(L==NULL||pos<1||pos>L->len+1)
{
printf("按位置插入失败\n");
return -1;
}
double_linklist *p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
double_linklist *s=creat(0);
s->data=f;
s->next=p->next;
s->prev=p;
if(p->next!=NULL)
{
p->next->prev=s;
}
p->next=s;
L->len++;
return 0;
}
//按位置删除
int delete_pos(double_linklist *L,int pos)
{
if(L==NULL||L->next==NULL||pos<1||pos>L->len)
{
printf("无法删除\n");
return -1;
}
double_linklist *p=L;
for(int i=0;i<pos-1;i++)//这里要删除pos,找到pos-1就行了
{
p=p->next;//现在p在pos-1这里
}
double_linklist *q=p->next;//在定义一个q让他成为pos这个位置方便后面转换
p->next=q->next;
if(q->next!=NULL)
{
q->next->prev=p;
}
free(q);
q=NULL;
printf("按位置删除成功\n");
}
//按位置修改
int revise_pos(double_linklist *L,datatype b,int pos)
{
if(L==NULL||L->next==NULL||pos<1||pos>L->len)
{
printf("无法修改\n");
return -1;
}
double_linklist *p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
p->data=b;
printf("按位置修改成功\n");
return 0;
}
//按位置查找
int find_pos(double_linklist *L,int pos)
{
if(L==NULL||L->next==NULL||pos<1||pos>L->len)
{
printf("无法查找\n");
return -1;
}
double_linklist *p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
printf("此位置的数据是:%c",p->data);
return 0;
}
3.head.h
#ifndef N
#define N
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char datatype;
typedef struct Node
{
//数据域
union
{
int len;
datatype data;
};
struct Node *next;
struct Node *prev;
}double_linklist;
void menue();
double_linklist *creat(int flag);
void output(double_linklist *L);
int insert_head(double_linklist *L,datatype e);
int input_rear(double_linklist *L,datatype e);
int delete_head(double_linklist *L);
int delete_rear(double_linklist *L);
int input_pos(double_linklist *L,datatype f,int pos);
int delete_pos(double_linklist *L,int pos);
int revise_pos(double_linklist *L,datatype b,int pos);
int find_pos(double_linklist *L,int pos);
#endif
二、双向循环链表
1.main.c
#include"head.h"
int main(int argc, char const *argv[])
{
loop_double_linklist *L=creat(1);//1头节点 0普通节点
/*menue();*/
//头插
/*int n;datatype e;
printf("输入头插几个元素:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入要头插的元素:");
scanf("%f",&e);
insert_head(L,e);
}
puts("");
output(L);*/
puts("");
//尾插
int n;datatype a;
printf("输入尾插几个元素:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入要尾插的元素:");
scanf("%f",&a);
insert_rear(L,a);
}
puts("");
output(L);
puts("");
//头删
/*delete_head(L);
puts("");
output(L);
puts("");*/
//尾删
delete_rear(L);
puts("");
output(L);
puts("");
2.text.c
#include"head.h"
/*void menue()
{
puts("****************");
puts("1.双向循环链表头插");//永远在头结点后面插入
puts("2.双向循环链表遍历");
puts("3.双向循环链表尾插");
puts("");
puts("4.单项链表头删");
puts("5.单项链表尾删");
puts("");
puts("0.退出整个程序:");
puts("");
}*/
loop_double_linklist *creat(int flag)
{
loop_double_linklist *L=(loop_double_linklist *)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
//成功返回地址
//成功之后初始化
if(flag==1)//头节点,需要让len为0
{
L->len=0;
L->next=L;//双向需要让自己的next和prev都指向自己
L->prev=L;
}
else if(flag==0)//普通节点,就是数据域为0
{
L->data=0;
L->next=NULL;//普通节点都指向NULL,后面还要指向
L->prev=NULL;
}
return L;
}
//双向循环头插
int insert_head(loop_double_linklist *L,datatype e)
{
if(L==NULL)
{
printf("不需要头插\n");
return -1;
}
loop_double_linklist *s=creat(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->next=L->next;
s->prev=L;
L->next->prev=s;
L->next=s;
L->len++;
return 0;
}
//输出
void output(loop_double_linklist *L)
{
puts("正向输出");
loop_double_linklist *p=L;
while(p->next!=L)
{
p=p->next;
printf("%.1f\t",p->data);
}
puts("\n逆向输出");
while(p->prev!=L->prev)
{
printf("%.1f\t",p->data);
p=p->prev;
}
puts("");
}
//尾插
int insert_rear(loop_double_linklist *L,datatype a)
{
if(L==NULL)
{
printf("尾插失败\n");
return -1;
}
loop_double_linklist *p=L->prev;
loop_double_linklist *s=creat(0);
if(s==NULL)
{
printf("s创建失败\n");
return -1;
}
s->data=a;
s->prev=p;
s->next=L;
L->prev=s;
p->next=s;
return 0;
}
//头删
int delete_head(loop_double_linklist *L)
{
if(L==NULL||L->next==NULL)
{
printf("无法头删\n");
return -1;
}
loop_double_linklist *p=L->next;
L->next=p->next;
p->next->prev=L;
free(p);
p=NULL;
printf("头删成功\n");
return 0;
}
//尾删
int delete_rear(loop_double_linklist *L)
{
if(L==NULL||L->next==NULL)
{
printf("无法尾删\n");
return -1;
}
loop_double_linklist *p=L->prev;
p->prev->next=L;
L->prev=p->prev;
free(p);
p=NULL;
printf("尾删成功\n");
return 0;
}
3.head.h
#ifndef N
#define N
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef float datatype;
typedef struct Node
{
//数据域
union
{
int len;
datatype data;
};
struct Node *next;
struct Node *prev;
}loop_double_linklist;
void menue();
loop_double_linklist *creat(int flag);
void output(loop_double_linklist *L);
int insert_head(loop_double_linklist *L,datatype e);
int insert_rear(loop_double_linklist *L,datatype a);
int delete_head(loop_double_linklist *L);
int delete_rear(loop_double_linklist *L);
#endif