9.18双向链表和双向循环链表

双向链表

头文件

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值