m双向链表按位置删除
双向链表按位置修改
双向链表按位置查找
head.h
#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;
int insert_pos(double_linklist L,int pos,datatype e);
int delete_rear(double_linklist L);
int delete_head(double_linklist L);
int insert_rear(double_linklist L,datatype e);
void output(double_linklist L);
double_linklist create(int flag);
int insert_head(double_linklist L,datatype e);
int delete_pos(double_linklist L,int pos);
int change_pos(double_linklist L,int pos2,datatype e);
int look_pos(double_linklist L,int pos);
#endif
main.c
//按位置删除
int pos1;
printf("请输入删除的位置:\n");
scanf("%d",&pos1);
delete_pos(L,pos1);
output(L);
//按位置修改
int pos2;
printf("请输入修改的位置:\n");
scanf("%d",&pos2);
printf("请输入修改的数据元素:");
scanf(" %c",&e);
change_pos(L,pos2,e);
output(L);
//按位置查找
int pos3;
printf("请输入查找的位置:\n");
scanf("%d",&pos3);
look_pos(L,pos3);
output(L);
}
test.c
//按位置插入
/* int pos;
printf("请输入插入的位置:\n");
scanf("%d",&pos);
printf("请输入插入的数据元素:");
scanf(" %c",&e);
insert_pos(L,pos,e);
output(L);
}
*/
//按位置删除
int pos1;
printf("请输入删除的位置:\n");
scanf("%d",&pos1);
delete_pos(L,pos1);
output(L);
//按位置修改
int pos2;
printf("请输入修改的位置:\n");
scanf("%d",&pos2);
printf("请输入修改的数据元素:");
scanf(" %c",&e);
change_pos(L,pos2,e);
output(L);
//按位置查找
int pos3;
printf("请输入查找的位置:\n");
scanf("%d",&pos3);
look_pos(L,pos3);
output(L);
}
双向链表循环链表头插
双向链表循环链表头删
双向链表循环链表尾插
双向链表循环链表尾删
双向链表循环链表输出
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_linklist;
loop_double_linklist create(int flag);
int insert_head(loop_double_linklist L,datatype e);
int delete_head(loop_double_linklist L);
int output(loop_double_linklist L);
int insert_rear(loop_double_linklist L,datatype e);int delete_rear(loop_double_linklist L);
main.c
int main(int argc,char*argv[])
{
loop_double_linklist L=create(1);
//双向循环链表头插
int n;
datatype e;
printf("输入头插的个数:\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("输入插入的小数:\n");
scanf("%f",&e);
insert_head(L,e);
}
//双向循环链表头删
delete_head(L);
//双向循环链表尾插
int m;
datatype k;
printf("输入尾插的个数:\n");
scanf("%d",&m);
for(int i=0;i<m;i++)
{
printf("输入尾插的小数:\n");
scanf("%f",&k);
insert_rear(L,k);
}
//双向循环链表头删
delete_rear(L);
//输出
output(L);
return 0;
}
test.c
loop_double_linklist create(int flag)
{
loop_double_linklist L=(loop_double_linklist)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
if(flag==1)
{
L->len=0;
L->next=L;
L->prev=L;
}
if(flag==0)
{
L->data=0;
L->next=NULL;
L->prev=NULL;
}
return L;
}
//双向循环链表头插
int insert_head(loop_double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist 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;
}
//双向循环链表头删
int delete_head(loop_double_linklist L)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist q=L->next;
L->next=q->next;
q->next->prev=L;
L->len--;
free(q);
q=NULL;
return 0;
}
//输出
int output(loop_double_linklist L)
{
if(L==NULL||L->len==0)
{
return -1;
}
loop_double_linklist p=L;
while(p->next!=L)
{
p=p->next;
printf("%.2f ",p->data);
}
while(p->prev!=L->prev)
{
printf("%.2f ",p->data);
p=p->prev;
}
return 0;
}
//双向循环链表尾插
int insert_rear(loop_double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist p=L;
while(p->next!=L)
{
p=p->next;
}
loop_double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->next=L;
s->prev=p;
p->next=s;
L->prev=s;
L->len++;
return 0;
}
//双向循环链表头删
int delete_rear(loop_double_linklist L)
{
if(L==NULL||L->len==0)
{
return -1;
}
loop_double_linklist p=L->prev;
p->prev->next=L;
L->prev=p->prev;
free(p);
p=NULL;
}