双向循环链表
//3.h
#ifndef __3_H__
#define __3_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef float datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *next;
struct node *prev;
}*loopDoubleLink;
loopDoubleLink create(int flag);
int insert_head(loopDoubleLink l,datatype e);
void delete_head(loopDoubleLink l);
void delete_tail(loopDoubleLink l);
void output(loopDoubleLink l);
int insert_tail(loopDoubleLink l,datatype e);
#endif
//fun3.c
#include "3.h"
//创建
loopDoubleLink create(int flag)
{
loopDoubleLink l = (loopDoubleLink)malloc(sizeof(struct node));
if(!l)
{
printf("create failed\n");
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 = NULL;
}
return l;
}
//头插
int insert_head(loopDoubleLink l,datatype e)
{
if(!l)
{
printf("insert_head failed \n");
return -1;
}
loopDoubleLink s = create(0);
if(!s) 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(loopDoubleLink l)
{
if(!l || l->next == l)
{
printf("output failed\n");
return;
}
loopDoubleLink p = l;
printf("->");
while(p->next != l)
{
p = p->next;
printf("%.2f\t",p->data);
}
puts("");
printf("<-");
while(p!=l)
{
printf("%.2f\t",p->data);
p= p->prev;
}
puts("");
}
//尾插
int insert_tail(loopDoubleLink l,datatype e)
{
if(!l)
{
printf("insert_tail failed\n");
return -1;
}
loopDoubleLink s = create(0);
if(!s) return -1;
s->data = e;
loopDoubleLink p = l->prev;
s->next = p->next;
s->prev = p;
p->next->prev = s;
p->next = s;
l->len++;
return 0;
}
//头删
void delete_head(loopDoubleLink l)
{
if(!l) return;
loopDoubleLink p = l->next;
l->next = p->next;
p->next->prev = l;
free(p);
p = NULL;
l->len--;
}
//尾删
void delete_tail(loopDoubleLink l)
{
if(!l) return;
loopDoubleLink p = l->prev;
l->prev = p->prev;
p->prev->next = l;
free(p);
p = NULL;
l->len --;
}
// 3.c
#include "3.h"
int main(int argc, const char *argv[])
{
int n;
datatype e;
loopDoubleLink l = create(1);
//头插
#if 0
printf("input insert_head number\n");
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
printf("input insert_head data\n");
scanf("%f",&e);
insert_head(l,e);
}
//输出
output(l);
#else
//尾插
printf("input insert_tail number\n");
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
printf("input insert_tail data\n");
scanf("%f",&e);
insert_tail(l,e);
}
output(l);
delete_head(l);
output(l);
delete_tail(l);
output(l);
#endif
return 0;
}
双向链表
//2.h
#ifndef __2_H__
#define __2_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *prev;
struct node *next;
}*doubleLink;
doubleLink create(int flag);
void output(doubleLink l);
int insert_head(doubleLink l,datatype e);
int insert_tail(doubleLink l,datatype e);
int delete_head(doubleLink l);
int delete_tail(doubleLink l);
int insert_pos(doubleLink l, int pos,datatype e);
int delete_pos(doubleLink l, int pos);
int chang_pos(doubleLink l,int pos,datatype e);
#endif
#include "2.h"
//创建
doubleLink create(int flag)
{
doubleLink l = (doubleLink)malloc(sizeof(struct node));
if(!l) 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(doubleLink l,datatype e)
{
if(!l)
{
printf("insert_head failed\n");
return -1;
}
doubleLink s = create(0);
if(!s) return -1;
s->data = e;
s->prev = l;
s->next = l->next;
if(l->next)
{
l->next->prev = s;
}
l->next = s;
l->len++;
return 0;
}
//输出
void output(doubleLink l)
{
if(!l || !l->next)
{
printf("output failed\n");
return;
}
printf("->\n");
doubleLink p = l;
while(p->next)
{
p = p->next;
printf("%c\t",p->data);
}
puts("");
printf("<-\n");
while(p->prev)
{
printf("%c\t",p->data);
p = p->prev;
}
puts("");
}
//尾插
int insert_tail(doubleLink l,datatype e)
{
if(!l)
{
printf("insert_tail failed\n");
return -1;
}
doubleLink p = l;
for(int i = 0; i < l->len; i++)
p = p->next;
doubleLink s = create(0);
s->data = e;
s->next = p->next;
s->prev = p;
p->next = s;
l->len++;
return 0;
}
//头删
int delete_head(doubleLink l)
{
if(!l || !l->next)
{
printf("delete_head failed\n");
return -1;
}
doubleLink q = l->next;
l->next = q->next;
if(q->next) q->next->prev = l;
free(q);
q = NULL;
return 0;
}
//尾删
int delete_tail(doubleLink l)
{
if(!l || !l->next)
{
printf("delete_tail failed\n");
return -1;
}
doubleLink p = l;
while(p->next) p = p->next;
p->prev->next = p->next;
free(p);
p = NULL;
l->len--;
}
//按位置插入
int insert_pos(doubleLink l, int pos,datatype e)
{
if(!l || pos<1 || pos>l->len+1)
{
printf("insert_pos failed\n");
return -1;
}
doubleLink p = l;
for(int i = 0; i < pos-1; i++)
p = p->next;
doubleLink s = create(0);
if(!s) return -1;
s->data = e;
s->next = p->next;
s->prev = p;
if(p->next) p->next->prev = s;
p->next = s;
l->len ++;
return 0;
}
//按位置删除
int delete_pos(doubleLink l, int pos)
{
if(!l || pos < 1 || pos > l->len)
{
printf("delete_pos failed\n");
return -1;
}
doubleLink p = l;
for(int i = 0; i < pos; i++)
p = p->next;
if(p->next) p->next->prev = p->prev;
p->prev->next = p->next;
free(p);
p = NULL;
return 0;
}
//按位置修改
int chang_pos(doubleLink l,int pos,datatype e)
{
if(!l || pos < 1 || pos > l->len)
{
printf("chang_pos failed\n");
return -1;
}
doubleLink p = l;
for(int i = 0; i < pos; i++)
p = p->next;
p->data = e;
return 0;
}
//2.c
#include "2.h"
int main(int argc, const char *argv[])
{
doubleLink l = create(1);
int n;
datatype e;
//头插
printf("input insert_head number\n");
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
printf("input insert_head data\n");
scanf(" %c",&e);
insert_head(l,e);
}
output(l);
#if 0
//头删
delete_head(l);
output(l);
//尾插
printf("input insert_tail number\n");
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
printf("input insert_tail data\n");
scanf(" %c",&e);
insert_tail(l,e);
}
output(l);
//尾删
delete_tail(l);
output(l);
//按位置插
int pos;
printf("input insert_pos number\n");
scanf("%d",&pos);
printf("input insert_pos data\n");
scanf(" %c",&e);
insert_pos(l,pos,e);
output(l);
//按位置删除
printf("input delete_pos number\n");
scanf("%d",&n);
delete_pos(l,n);
output(l);
#else
//按位置修改
printf("input chang_pos number\n");
scanf("%d",&n);
printf("input chang_pos data\n");
scanf(" %c",&e);
chang_pos(l,n,e);
output(l);
#endif
return 0;
}