head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include
#include
#include
typedef char datatype[20];
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *prev;//储存前驱节点地址
struct node *next;//储存后继节点地址
}*doubleLink,Node;
doubleLink creatHead();
doubleLink creat();
void InsertHead(doubleLink L,datatype e);
void doubleLinkshow(doubleLink L);
void doublerear(doubleLink L,datatype e1);
void doubleLinkdeletbyHead(doubleLink L);
void doubleLinkdeletbyrear(doubleLink L);
int InsertBypos(doubleLink L,int pos,datatype e);
void doubleLinkbydata(doubleLink L,datatype e3);
#endif
test.c
#include "head.h"
//创建头节点
//成功返回头节点,失败返回NULL
doubleLink creatHead()
{
doubleLink L=(doubleLink)malloc(sizeof(Node));
if(L==NULL)
return NULL;
L->len=0;//头节点的数据域赋值,链表为0
L->prev=NULL;
L->next=NULL;
return L;
}
doubleLink creat()
{
doubleLink p=(doubleLink)malloc(sizeof(Node));
if(p==NULL)
return NULL;
strcpy(p->data,"");
p->prev=NULL;
p->next=NULL;
return p;
}
//头插
void InsertHead(doubleLink L,datatype e)
{
if(L==NULL)
{
printf("1");
return;
}
doubleLink p=creat();
strcpy(p->data,e);
p->next=L->next;
p->prev=L;
if(L->next!=NULL)
{
L->next->prev=p;
}
L->next=p;
L->len++;
}
//尾插
void doublerear(doubleLink L,datatype e1)
{
if(L==NULL)
return;
doubleLink p=creat();
if(p==NULL)
return;
doubleLink q=L;
while(q->next)
{
q=q->next;
}
strcpy(p->data,e1);
q->next=p;
p->prev=q;
L->len++;
}
//双向链表遍历
//双向有两个方向
void doubleLinkshow(doubleLink L)
{
//正向打印
printf("正向遍历\n");
doubleLink p=L;
while(p->next!=NULL)
{
p=p->next;
printf("%s\t",p->data);
}
printf("\n逆向遍历\n");
while(p!=L)
{
printf("%s\t",p->data);
p=p->prev;
}
printf("\n");
}
//头删
void doubleLinkdeletbyHead(doubleLink L)
{
if(L==NULL)
{
printf("链表为空,不可删除\n");
return;
}
doubleLink p=L->next;
L->next=p->next;
if(p->next!=NULL)
p->next->prev=L;
free(p);
p=NULL;
L->len--;
}
//尾删
void doubleLinkdeletbyrear(doubleLink L)
{
if(L->len==0)
{
printf("删除失败\n");
return;
}
doubleLink p=L;
while(p->next)
{
p=p->next;
}
p->prev->next=NULL;
free(p);
p=NULL;
L->len--;
}
//按位置插入
int InsertBypos(doubleLink L,int pos,datatype e)
{
if(L==NULL||pos<1||pos>L->len+1)
{
return -1;
}
doubleLink p=L;
doubleLink k=creat();
if(k==NULL)
return -1;
for(int i=0;inext;
}
strcpy(k->data,e);
k->next=p->next;
k->prev=p;
if(p->next==NULL)
p->next->prev=k;
p->next=k;
L->len++;
return 0;
}
void doubleLinkbydata(doubleLink L,datatype e3)
{
doubleLink p=L;
for(int i=0;ilen;i++)
{
p=p->next;
if(strcmp(p->data,e3)==0)
{
doubleLink q=p->next;
q->prev=p->prev;
p->prev->next=q;
p->prev->next=p->next;
free(p);
p=NULL;
}
L->len--;
}
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
doubleLink L=creatHead();
if(L==NULL)
{
printf("头节点创建失败\n");
return -1;
}
//头插
#if 0
datatype e;
for(int i=0;i<5;i++)
{
printf("\n输入插入的值:");
scanf("%s",e);
InsertHead(L,e);
}
doubleLinkshow(L);
#endif
//尾插
datatype e;
for(int i=0;i<5;i++)
{
scanf("%s",e);
doublerear(L,e);
}
doubleLinkshow(L);
// doubleLinkdeletbyHead(L);
// doubleLinkdeletbyrear(L);
// doubleLinkshow(L);
//按位置插入
#if 0
int pos;
datatype e2;
printf("\n输入擦入的位置:");
scanf("%d",&pos);
printf("\n输入插入的值");
scanf("%s",e2);
InsertBypos(L,pos,e2);
//双向链表遍历
#endif
//按元素插入
datatype e3;
printf("请输入元素");
scanf("%s",e3);
doubleLinkbydata(L,e3);
doubleLinkshow(L);
return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include "head.h"
#include
#include
typedef float datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *next;
struct node *prev;
}*Looplink,Node;
Looplink creathead();
Looplink creatnode();
void Inserthead(Looplink L,datatype e);
void Looplinkshow(Looplink L);
void Insertreal(Looplink L,datatype e);
void deletehead(Looplink L);
void deletereal(Looplink L);
void Insertbypos(Looplink L,int pos,datatype e);
#endif
#include "head.h"
Looplink creathead()
{
Looplink L=(Looplink)malloc(sizeof(Node));
if(L==NULL)
{
return NULL;
}
L->len=0;
L->next=L;
L->prev=L;
return L;
}
Looplink creatnode()
{
Looplink p=(Looplink)malloc(sizeof(Node));
if(p==NULL)
{
return NULL;
}
p->data=0;
p->next=NULL;
p->prev=NULL;
return p;
}
void Inserthead(Looplink L,datatype e)
{
if(L==NULL)
{
return;
}
Looplink p=creatnode();
if(p==NULL)
return;
p->data=e;
p->next=L->next;
p->prev=L;
L->next->prev=p;
L->next=p;
L->len++;
}
void Looplinkshow(Looplink L)
{
printf("\n正向打印");
Looplink p=L;
while(p->next!=L)
{
p=p->next;
printf("%.2f\t",p->data);
}
printf("\n逆向打印");
while(p!=L)
{
printf("%.2f\t",p->data);
p=p->prev;
}
printf("\n");
}
void Insertreal(Looplink L,datatype e)
{
if(L==NULL)
return;
Looplink q=L->prev;
Looplink p=creatnode();
if(p==NULL)
return;
p->data=e;
p->next=q->next;
p->prev=q;
q->next->prev=p;
q->next=p;
L->len++;
}
void deletehead(Looplink L)
{
if(L->len==0)
{
printf("删除失败\n");
return;
}
Looplink p=L->next;
L->next=p->next;
p->next->prev=L;
free(p);
p=NULL;
L->len--;
}
void deletereal(Looplink L)
{
if(L->len==0)
{
printf("删除失败\n");
return;
}
Looplink q=L->prev;
L->prev=q->prev;
q->prev->next=L;
free(q);
q=NULL;
L->len--;
}
void Insertbypos(Looplink L,int pos,datatype e)
{
if(L==NULL)
return;
if(pos<1||pos>L->len+1)
return;
Looplink p=L;
for(int i=0;inext;
}
Looplink q=creatnode();
q->data=e;
q->next=p;
q->prev=p->prev;
p->prev=q;
p->prev->next=q;
L->len++;
}
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Looplink L=creathead();
if(L==NULL)
return -1;
#if 0
for(int i=0;i<5;i++)
{
datatype e;
scanf("%f",&e);
Inserthead(L,e);
}
Looplinkshow(L);
#endif
//尾插
for(int i=0;i<5;i++)
{
datatype e1;
scanf("%f",&e1);
Insertreal(L,e1);
}
//遍历
Looplinkshow(L);
// deletehead(L);
// deletehead(L);
// Looplinkshow(L);
//尾删
// deletereal(L);
// deletereal(L);
// 按位置插入
int pos;
datatype e;
printf("输入插入位置");
scanf("%d",&pos);
printf("输入插入值");
scanf("%f",&e);
Insertbypos(L,pos,e);
Looplinkshow(L);
return 0;
}
#ifndef __HEAD_H__
#define __HEAD_H__
#include
#include
typedef int datatype;
typedef struct node
{
union
{
int len;
datatype data;
};
struct node *next;
}*Looplink,Node;
Looplink createHead();
Looplink createnode();
void InsertHead(Looplink L,datatype e);
void Looplinkshow(Looplink L);
void Insertreal(Looplink L,datatype e);
void deletreal(Looplink L);
void deletHead(Looplink L);
void josepho(Looplink L,int m,int n);
#endif
#include "head.h"
//
//
Looplink createHead()
{
Looplink L=(Looplink)malloc(sizeof(Node));
if(L==NULL)
{
printf("创建失败\n");
return NULL;
}
L->len=0;
L->next=L;
return L;
}
Looplink createnode()
{
Looplink p=(Looplink)malloc(sizeof(Node));
if(p==NULL)
{
printf("创建失败\n");
return NULL;
}
p->data=0;
p->next=NULL;
return p;
}
//头插
void InsertHead(Looplink L,datatype e)
{
if(L==NULL)
return;
Looplink p=createnode();
if(p==NULL)
{
return;
}
p->data=e;
p->next=L->next;
L->next=p;
L->len++;
}
//遍历链表
void Looplinkshow(Looplink L)
{
Looplink p=L;
while(p->next!=L)
{
p=p->next;
printf("%d\t",p->data);
}
printf("\n");
}
void Insertreal(Looplink L,datatype e)
{
if(L==NULL)
return;
Looplink q=L;
for(int i=0;i
{
q=q->next;
}
Looplink p=createnode();
if(p==NULL)
return;
p->data=e;
p->next=q->next;
q->next=p;
L->len++;
}
void deletreal(Looplink L)
{
if(L->len==0)
{
printf("链表为空,无删除值\n");
return;
}
Looplink p=L;
for(int i=0;i
{
p=p->next;
}
p->next=L;
free(p->next);
L->len--;
}
void deletHead(Looplink L)
{
if(L->len==0)
return;
Looplink p=L->next;
L->next=p->next;
free(p);
p=NULL;
L->len--;
}
void josepho(Looplink L,int m,int n)
{
int i,j;
Looplink p=L;
for(i=0;i { for(j=0;i { p=p->next; if(p==L) j--; } Looplink q=p->next; if(q==L) q=L->next; printf("%d\t",q->data); p->next=q->next; free(q); q=NULL; } }#include "head.h"
int main(int argc, const char *argv[])
{
Looplink L=(Looplink)malloc(sizeof(Node));
if(L==NULL)
{
return -1;
}
//头插:永远在第一个节点的位置插入
#if 0
int n;
printf("\n输入元素个数");
scanf("%d",&n);
datatype e;
#endif
#if 0
for(int i=0;i