双向链表:
test.c
#include "head.h"
doubule_linklist create(int flag)
{
doubule_linklist L = (doubule_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(doubule_linklist L,datatype e)
{
if (L == NULL)
{
return -1;
}
doubule_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(doubule_linklist L)
{
if(L ==NULL || L->next == NULL)
{
puts("遍历失败");
return ;
}
puts("正向遍历");
doubule_linklist p = L;
while(p->prev != NULL)
{
printf("%c\t",p->data);
p = p->prev;
}
puts("逆向遍历");
while(p->next !=NULL)
{
printf("%c\t",p->data);
p = p->next;
}
}
/*
* function: 尾插
* @param [ in]
* @param [out]
* @return
*/
int insert_rear(doubule_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
doubule_linklist p = L;
while(p->next != NULL)
{
p = p->next;
}
doubule_linklist s = create(0);
if(s == NULL)
{
return -1;
}
s->data = e;
p->next = s;
s->prev = p;
L->len++;
return 0;
}
/*
* function: 头删
* @param [ in]
* @param [out]
* @return
*/
int delete_head(doubule_linklist L)
{
if(L == NULL|| L->next == NULL)
{
return -1;
}
doubule_linklist q = L->next;
L->next = q->next;
if(q->next != NULL)
{
q->next->prev = L;
}
free(q);
q=NULL;
L->len--;
return 0;
}
/*
* function: 尾删
* @param [ in]
* @param [out]
* @return
*/
int delete_rear(doubule_linklist L)
{
if(L==NULL||L->next == NULL)
{
return -1;
}
doubule_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] 链表 插入的值 插入的位置pos
* @param [out]
* @return
*/
int insert_pos(doubule_linklist L,int pos,datatype e)
{
if(L == NULL || pos<1 || pos >L->len+1)
{
return -1;
}
doubule_linklist p = L;
for(int i =0;i<pos-1;i++)
{
p = p->next;
}
doubule_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;
}
/*
* function: 按位删除
* @param [ in] 链表 删除位置pos
* @param [out]
* @return
*/
int delete_pos(doubule_linklist L,int pos)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos-1;i++)
{
p=p->next;
}
doubule_linklist q = p->next;
if (q->next != NULL)
{
q->next->prev = p;
}
free(q);
q=NULL;
L->len--;
return 0;
}
/*
* function: 按位修改
* @param [ in] 链表 位置 值e
* @param [out]
* @return
*/
int remove(doubule_linklist L,int pos,datatype e)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos;i++)
{
p=p->next;
}
p->data = e;
}
/*
* function: 按位查找
* @param [ in] 链表 位置
* @param [out]
* @return
*/
int find_pos(doubule_linklist L,int pos)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos;i++)
{
p=p->next;
}
printf("查找的元素为:%c",p->data);
}
双向链表按位删除
/*
* function: 按位删除
* @param [ in] 链表 删除位置pos
* @param [out]
* @return
*/
int delete_pos(doubule_linklist L,int pos)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos-1;i++)
{
p=p->next;
}
doubule_linklist q = p->next;
if (q->next != NULL)
{
q->next->prev = p;
}
free(q);
q=NULL;
L->len--;
return 0;
}
双向链表按位修改
/*
* function: 按位修改
* @param [ in] 链表 位置 值e
* @param [out]
* @return
*/
int remove(doubule_linklist L,int pos,datatype e)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos;i++)
{
p=p->next;
}
p->data = e;
}
双向链表按位查找
/*
* function: 按位查找
* @param [ in] 链表 位置
* @param [out]
* @return
*/
int find_pos(doubule_linklist L,int pos)
{
if(L == NULL || pos<1 || pos >L->len || L->len == NULL)
{
return -1;
}
doubule_linklist p = L;
for(int i = 0;i<pos;i++)
{
p=p->next;
}
printf("查找的元素为:%c",p->data);
}
双向循环列表
head.h
#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;
void menue();//菜单
loop_double_link create(int flag);//创建节点
int insert_head(loop_double_link L,datatype e);//头插
int insert_rear(loop_double_link L,datatype e);//尾插
int delete_head(loop_double_link L);//头删
int delete_rear(loop_double_link L);//尾删
void output(loop_double_link L);//输出
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
loop_double_link L = create(1);
menue();
int number;
while(1)
{
printf("请输入您的选择:");
scanf("%d",&number);
switch(number)
{
case 1:
{
int n;
datatype e;
printf("请输入要输入的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要在头部插入的值:");
scanf("%f",&e);
insert_head(L,e);
}
}break;
case 2:
{
int n;
datatype e;
printf("请输入要输入的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入要在尾部插入的值:");
scanf("%f",&e);
insert_rear(L,e);
}
}break;
case 3:
{
int n;
printf("请输入要头删的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
delete_head(L);
}
}break;
case 4:
{
int n;
printf("请输入要尾删的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
delete_rear(L);
}
}break;
case 5:
{
output(L);
}break;
default:printf("输入错误,请重新输入您的选择\n");break;
case 0:printf("退出程序\n");exit(0);
}
}
return 0;
}
test.c
#include "head.h"
void menue()
{
puts("\t****************");
puts("\t1,双向循环列表头插");
puts("\t2,双向循环列表尾插");
puts("\t3,双向循环列表头删");
puts("\t4,双向循环列表尾删");
puts("\t5,双向循环列表输出");
puts("\t0,退出整个程序");
puts("\t****************");
}
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->data = 0;
L->next = NULL;
L->prev = L;
}
return L;
}
/*
* function: 头插
* @param [ in] 链表 要插入的值e
* @param [out]
* @return
*/
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++;
puts("插入成功");
return 0;
}
/*
* function: 尾插
* @param [ in] 链表 要插入的值e
* @param [out]
* @return
*/
int insert_rear(loop_double_link L,datatype e)
{
if (L == NULL)
{
return -1;
}
loop_double_link p = L->prev;
loop_double_link s = create(0);
if(s == NULL)
{
return -1;
}
s->data =e;
s->next = p->next;
s->prev = p;
p->next->prev = s;
p->next = s;
L->len++;
puts("插入成功");
return 0;
}
/*
* function: 头删
* @param [ in] 链表
* @param [out]
* @return
*/
int delete_head(loop_double_link L)
{
if(L == NULL)
{
return -1;
}
loop_double_link q = L->next;
L->next = q->next;
q->next->prev = L;
free(q);
q = NULL;
puts("头删成功");
return 0;
}
/*
* function: 尾删
* @param [ in] 链表
* @param [out]
* @return
*/
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;
puts("尾删成功");
return 0;
}
/*
* function: 输出
* @param [ in] 链表
* @param [out]
* @return
*/
void output(loop_double_link L)
{
loop_double_link p = L;
puts("正向遍历");
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");
}