//双向链表
#include"head2.h"
int main(int argc, const char *argv[])
{
double_linklist L=create(1);
//循环头插
int n;
datatype e;
printf("输入插入个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入%d数据元素:",i+1);
scanf(" %c",&e);
insert_head(L,e);
}
output(L);
//头删
// delete_head(L);
// delete_head(L);
// delete_rear(L);
// delete_rear(L);
/*
int pos;
datatype e;
printf("输入插入的位置:");
scanf("%d",&pos);
printf("输入插入的值:");
scanf(" %c",&e);
insert_pos(L,pos,e);
output(L);
*/
/*按位置删除
int pos;
printf("输入删除的位置:");
scanf("%d",&pos);
delete_pos(L,pos);
output(L);
*/
/*按位置修改
int pos;
printf("输入修改的位置:");
scanf("%d",&pos);
printf("输入修改的值:");
scanf(" %c",&e);
change_pos(L,pos,e);
output(L);
*/
/*按位置查找
int pos;
printf("输入查找的位置:");
scanf("%d",&pos);
find_pos(L,pos);
*/
return 0;
}
————————————————
版权声明:本文为CSDN博主「我没说你可以肘了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_60026178/article/details/130754059
#include"head2.h"
/*
* function: 创建头节点
* @param [ in]
* @param [out] 无
* @return 成功返回地址 失败返回NULL
*/
double_linklist create(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;
}
/*
* function:
* @param [ in]
* @param [out]
* @return
*/
int insert_head(double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
double_linklist s=create(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;
}
/*
* function: 循环输出
* @param [ in] 链表
* @param [out]
* @return 无
*/
void output(double_linklist L)
{
if(L==NULL||L->next==NULL)
{
printf("遍历失败\n");
return;
}
puts("正向遍历");
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
printf("%c\t",p->data);
}
puts("\n逆向遍历");
while(p->prev!=NULL)
{
printf("%c\t",p->data);
p=p->prev;
}
puts("");
}
/*
* function: 尾部插入
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_rear(double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
//循环到尾节点
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
}
double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->prev=p;
p->next=s;
L->len++;
return 0;
}
/*
* function: 头删除
* @param [ in]
* @param [out] 链表
* @return 成功返回0 失败返回-1
*/
int delete_head(double_linklist L)
{
if(L==NULL||L->next==NULL)
{
return -1;
}
double_linklist p=L->next;
L->next=p->next;
if(p->next!=NULL)
{
p->next->prev=L;
}
free(p);
p=NULL;
L->len--;
}
/*
* function: 尾部删除
* @param [ in] 链表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_rear(double_linklist L)
{
if(L=NULL)
{
return -1;
}
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
}
p->prev->next=NULL;
free(p);
p=NULL;
L->len--;
return 0;
}
/*
* function: 按位置插入
* @param [ in]
* @param [out]
* @return
*/
int insert_pos(double_linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len+1)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
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||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
double_linklist q=p->next;
p->next=q->next;
if(q->next!=NULL)
{
q->next->prev=p;
}
free(q);
q=NULL;
L->len--;
return 0;
}
//按位置修改
int change_pos(double_linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
p->data=e;
return 0;
}
//按位置查找
int find_pos(double_linklist L,int pos)
{
if(L==NULL||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
printf("查找的第%d位为: %c\n",pos,p->data);
}
#include"head2.h"
/*
* function: 创建头节点
* @param [ in]
* @param [out] 无
* @return 成功返回地址 失败返回NULL
*/
double_linklist create(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;
}
/*
* function:
* @param [ in]
* @param [out]
* @return
*/
int insert_head(double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
double_linklist s=create(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;
}
/*
* function: 循环输出
* @param [ in] 链表
* @param [out]
* @return 无
*/
void output(double_linklist L)
{
if(L==NULL||L->next==NULL)
{
printf("遍历失败\n");
return;
}
puts("正向遍历");
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
printf("%c\t",p->data);
}
puts("\n逆向遍历");
while(p->prev!=NULL)
{
printf("%c\t",p->data);
p=p->prev;
}
puts("");
}
/*
* function: 尾部插入
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_rear(double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
//循环到尾节点
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
}
double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->prev=p;
p->next=s;
L->len++;
return 0;
}
/*
* function: 头删除
* @param [ in]
* @param [out] 链表
* @return 成功返回0 失败返回-1
*/
int delete_head(double_linklist L)
{
if(L==NULL||L->next==NULL)
{
return -1;
}
double_linklist p=L->next;
L->next=p->next;
if(p->next!=NULL)
{
p->next->prev=L;
}
free(p);
p=NULL;
L->len--;
}
/*
* function: 尾部删除
* @param [ in] 链表
* @param [out]
* @return 成功返回0 失败返回-1
*/
int delete_rear(double_linklist L)
{
if(L=NULL)
{
return -1;
}
double_linklist p=L;
while(p->next!=NULL)
{
p=p->next;
}
p->prev->next=NULL;
free(p);
p=NULL;
L->len--;
return 0;
}
/*
* function: 按位置插入
* @param [ in]
* @param [out]
* @return
*/
int insert_pos(double_linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len+1)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
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||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
double_linklist q=p->next;
p->next=q->next;
if(q->next!=NULL)
{
q->next->prev=p;
}
free(q);
q=NULL;
L->len--;
return 0;
}
//按位置修改
int change_pos(double_linklist L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos-1;i++)
{
p=p->next;
}
p->data=e;
return 0;
}
//按位置查找
int find_pos(double_linklist L,int pos)
{
if(L==NULL||pos<1||pos>L->len)
{
printf("插入失败");
return -1;
}
double_linklist p=L;
for(int i=0;i<pos;i++)
{
p=p->next;
}
printf("查找的第%d位为: %c\n",pos,p->data);
}
#ifndef __HEAD_H__
#define __HEAD_H__
#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;
double_linklist create(int flag);
int insert_head(double_linklist L,datatype e);
void output(double_linklist L);
int delete_head(double_linklist L);
int delete_rear(double_linklist L);
int delete_pos(double_linklist L,int pos);
int change_pos(double_linklist L,int pos,datatype e);
int find_pos(double_linklist L,int pos);
#endif
双向循环链表:
#ifndef __HEAD_H__
#define __HEAD_H__
#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_link;
loop_double_link create(int flag);
int insert_head(loop_double_link L,datatype e);
void output(loop_double_link L);
int delete_head(loop_double_link L);
int insert_rear(loop_double_link L,datatype e);
int delete_rear(loop_double_link L);
#endif
#include"head3.h"
int main(int argc, const char *argv[])
{
loop_double_link L=create(1);
// 头插
/*
int n;
datatype e;
printf("输入个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入第%d个插入的元素:",i+1);
scanf("%f",&e);
insert_head(L,e);
}
output(L);
*/
/*头删
delete_head(L);
output(L);
*/
//尾插
//
int n;
datatype e;
printf("输入个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入第%d个插入的元素:",i+1);
scanf("%f",&e);
insert_rear(L,e);
}
output(L);
//
/*尾删
delete_rear(L);
output(L);
*/
return 0;
}
#include"head3.h"
/*
* function: 创建节点
* @param [ in]
* @param [out] 1:头 0:普通
* @return 成功返回地址 失败返回null
*/
loop_double_link create(int flag)
{
loop_double_link L=(loop_double_link)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
if(flag==1)
{
L->len=0;
L->next=L;
L->prev=L;
}
else if(flag==0)
{
L->len=0;
L->next=NULL;
L->prev=NULL;
}
return L;
}
/*
* function: 头插
* @param [ in] 链表 插入的值
* @param [out]
* @return 成功返回0 失败返回-1
*/
int insert_head(loop_double_link L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_link s=create(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_link L)
{
puts("正向遍历");
loop_double_link 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;
}
printf("\n");
}
//头删
int delete_head(loop_double_link L)
{
if(L==NULL)
{
return -1;
}
loop_double_link p=L->next;
L->next=p->next;
p->next->prev=L;
free(p);
p=NULL;
return 0;
}
//尾插
int insert_rear(loop_double_link L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_link s=create(0);
if(s==NULL)
{
return -1;
}
loop_double_link p=L->prev;
s->data=e;
s->next=p->next;
s->prev=p;
p->next->prev=s;
p->next=s;
L->len++;
return 0;
}
//尾删
int delete_rear(loop_double_link L)
{
if(L==NULL)
{
return -1;
}
loop_double_link p=L->prev;
p->prev->next=L;
L->prev=p->prev;
free(p);
p=NULL;
return 0;
}