双向链表
头文件
#ifndef __HEAD_H_
#define __HEAD_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义一个双向列表
typedef struct node
{
//数据域
char data;
//指针域下一个
struct node*next;
//指针域上一个
struct node*last;
}*linklist;
//头插
linklist insert_head(linklist L,char element);
//输出
void output(linklist L);
//尾插
linklist insert_rear(linklist L,char element);
//头删
linklist toushan(linklist L);
//尾部删除
linklist weishan(linklist L);
//释放
linklist shifang(linklist L);
#endif
函数
#include "head.h"
linklist create_node()
{
linklist s=(linklist)malloc(sizeof(struct node));
if(NULL==s)
{
return NULL;
}
s->data=0;
s->next=NULL;
s->last=NULL;
return s;
}
//头插
linklist insert_head(linklist L,char element)
{
linklist s=create_node();
s->data=element;
if(NULL==L)
{
L=s;
}
else
{
s->next=L->next;
s->last=L;
if(L->next!=NULL)
L->next->last=s;
L->next=s;
s->data=L->data;
L->data=element;
}
return L;
}
//输出
void output(linklist L)
{
if(NULL==L)
{
printf("空");
return;
}
puts("正向遍历");
linklist p=L;
while(p->next!=NULL)
{
printf("%c\t",p->data);
p=p->next;
}
printf("%c\n",p->data);
puts("逆向遍历");
while(p!=NULL)
{
printf("%c\t",p->data);
p=p->last;
}
puts("");
}
//尾插
linklist insert_rear(linklist L,char element)
{
linklist s=create_node();
s->data=element;
if(NULL==L)
{
L=s;
}
else
{
linklist p=L;
while(p->next!=NULL)
{
p=p->next;
}
p->next=s;
s->last=p;
}
return L;
}
//头删
linklist toushan(linklist L)
{
if(NULL==L)
{
return NULL;
}
else if(NULL==L->next)
{
free(L);L=NULL;
}
else
{
linklist q=L->next;
L->data=q->data;
L->next=q->next;
if(q->next->last=L)
free(q);q=NULL;
}
return L;
}
//尾部删除
linklist weishan(linklist L)
{//先判断是不是没有节点,没有则直接删除
if(NULL==L)
return NULL;
else if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
linklist p=L;//命名
while(p->next->next!=NULL)//找到倒数第二个节点
{
p=p->next;
}
free(p->next);
p->next=NULL;
}
return L;
}
//释放
linklist shifang(linklist L)
{//先判断是不是没有节点,没有则直接删除
if(NULL==L)
return NULL;
else if(L->next==NULL)
{
free(L);
L=NULL;
}
else
{
while(L->next!=NULL)
{
linklist p=L;//命名
while(p->next->next!=NULL)//找到倒数第二个节点
{
p=p->next;
}
free(p->next);
p->next=NULL;
}
free(L);
L=NULL;
}
return L;
}
主函数
#include "head.h"
int main(int argc, const char *argv[])
{
linklist L=NULL;
int n;
char element;
printf("请输入插入的个数");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入%d的值",i+1);
scanf(" %c",&element);
// L=insert_head(L,element);
L=insert_rear(L,element);
}
output(L);
L=toushan(L);
L=toushan(L);
output(L);
L=weishan(L);
output(L);
L=shifang(L);
output(L);
return 0;
}
双向循环链表
头文件
#ifndef __HEAD_H_
#define __HEAD_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//定义一个双向列表
typedef struct node
{
//数据域
char data;
//指针域下一个
struct node*next;
//指针域上一个
struct node*last;
}*linklist;
//头插
linklist insert_head(linklist L,char element);
//输出
void output(linklist L);
//尾插
linklist insert_rear(linklist L,char element);
//头删
linklist toushan(linklist L);
//尾删
linklist weishan(linklist L);
//释放
linklist shifang(linklist L);
#endif
函数
#include "head.h"
linklist create_node()
{
linklist s=(linklist)malloc(sizeof(struct node));
if(NULL==s)
{
return NULL;
}
s->data=0;
s->next=s;
s->last=s;
return s;
}
//头插
linklist insert_head(linklist L,char element)
{
linklist s=create_node();
s->data=element;
if(NULL==L)
{
L=s;
}
else
{
s->next=L->next;
s->last=L;
L->next->last=s;
L->next=s;
s->data=L->data;
L->data=element;
}
return L;
}
//输出
void output(linklist L)
{
if(NULL==L)
{
printf("空");
return;
}
puts("正向遍历");
linklist p=L;
while(p->next!=L)
{
printf("%c\t",p->data);
p=p->next;
}
printf("%c\n",p->data);
puts("逆向遍历");
while(p!=L)
{
printf("%c\t",p->data);
p=p->last;
}
printf("%c\t",p->data);
puts("");
}
//尾插
linklist insert_rear(linklist L,char element)
{
linklist s=create_node();
s->data=element;
if(NULL==L)
{
L=s;
}
else
{
linklist p=L->last;
p->next=s;
s->last=p;
s->next=L;
L->last=s;
}
return L;
}
//头删
linklist toushan(linklist L)
{
if(NULL==L)
{
return NULL;
}
else if(L==L->next)
{
free(L);L=NULL;
}
else
{
linklist q=L->next;
L->data=q->data;
L->next=q->next;
q->next->last=L;
free(q);q=NULL;
}
return L;
}
尾删
linklist weishan(linklist L)
{
if(NULL==L)
{
return NULL;
}
else if(L==L->next)
{
free(L);L=NULL;
}
else
{
linklist q=L->last;
q->last->next=L;
L->last=q->last;
free(q);q=NULL;
}
return L;
}
//释放
linklist shifang(linklist L)
{
if(NULL==L)
{
return NULL;
}
else if(L==L->next)
{
free(L);L=NULL;
}
else
{
while(L->next!=L)
{
linklist q=L->last;
q->last->next=L;
L->last=q->last;
free(q);q=NULL;
}
free(L);L=NULL;
}return L;
}
主函数
#include "head.h"
int main(int argc, const char *argv[])
{
linklist L=NULL;
int n;
char element;
printf("请输入插入的个数");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("请输入%d的值",i+1);
scanf(" %c",&element);
// L=insert_head(L,element);
L=insert_rear(L,element);
}
output(L);
toushan(L);
toushan(L);
output(L);
L=weishan(L);
output(L);
L=shifang(L);
output(L);
return 0;
}