天天看点

<html>

源文件部分:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef int Elemtype;
#include"Delist.h"
int main()
{
  Dlnode head=NULL;
  instruction(head);
  return 0;
}
头文件部分:
typedef struct DLnode        
{
  Elemtype data;
  struct DLnode *prior;    //节点的声明定义
  struct DLnode *next;
}DLnode,*Dlnode;

void Init_Dlist(Dlnode &head)    //循环双向初始化 
{
  head=(Dlnode)malloc(sizeof(DLnode));
  head->prior=head;
  head->next=head;
}

int Empty_Dlist(Dlnode head)       //双向判空
{
  if(head->prior==head&&head->next==head)
    return 1;
  return 0;
}

void Insert_Dlist(DLnode *head,Elemtype e)   //头插法-双向(新增)
{
  Dlnode p=NULL;
  p=(DLnode *)malloc(sizeof(DLnode));            //由于是双向循环链表,所以不存在双向的那个问题
  if(!p)
  {
    printf("对不起,已无很多其它的内存单元得到分配!!!\n");
    return ;
  }
  p->data=e;
  p->next=head->next;
  p->next->prior=p;
  p->prior=head;
//  printf("*%d*\n",head->next);
  head->next=p;
}

int Length_Dlist(Dlnode head)
{
  DLnode *p=NULL;
  int len=0;
  if(Empty_Dlist(head))
    return 0;
  p=head->next;
  while(p!=head)
  {
    len++;
    p=p->next;
  }
  return len;
}

int Delete_Dlist(DLnode *head,Elemtype where)        //按位置删除
{
  DLnode *p=NULL;
  int i=1;
  p=head->next;
  if(Empty_Dlist(head))
  {
    printf("对不起,链表是空的,无法完毕删除操作!!!\n");
    return 0;
  }
  if(where>Length_Dlist(head)||where<0)
  {
    printf("对不起,你删除的位置是不合法的,请又一次输入!!!\n");
    return 0;
  }
  while(i<where)
  {
    p=p->next;
    i++;
  }
  p->prior->next=p->prior->next->next;
  p->prior->next->prior=p->prior;
  printf("删除成功!!!\n");
  return p->data;
}

void Insearch_Dlist(Dlnode head,Elemtype e)      //按元素查找  
{
  DLnode *p=NULL;
  int len=1;
  if(Empty_Dlist(head))
  {
    printf("对不起,链表是空的,无法完毕查找操作!!!\n");
    return ;
  }
  p=head->next;
  while(p!=head)
  {
    if(p->data==e)
    {
      printf("你要查找的元素位于链表的第%d个位置上.\n",len);
      return ;
    }
    p=p->next;
    len++;
  }
  printf("对不起,你要查找的元素不存在,请又一次输入!!!\n");
  return ;
}

void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e)    //按位置改动
{
  DLnode *p=NULL;
  int len=1;
  p=head->next;
  while(len<where)
  {
    p=p->next;
    len++;
  }
  p->data=e;
  printf("改动成功!\n");
  return ;
}

void Print_Dlist(Dlnode head)          //打印操作
{
  Dlnode p=head->next;
  if(Empty_Dlist(head))
  {
    printf("对不起,链表是空的,无法完毕打印操作!!!\n");
    return ;
  }
  while(head!=p)
  {
    printf("%d ",p->data);
    p=p->next;
  }
  printf("\n");
  return ;
}

void Destory_Dlist(Dlnode head)            //销毁清空操作
{
  Dlnode p=head->next;
  while(p!=head)
  {
    p->prior->next=p->next;
    p->next->prior=p->prior;
    p=head->next;
  }
  printf("销毁成功!\n");
}

void instruction(Dlnode head)             //功能函数 
{
  int n,m,t,a,b,len1,index;
  printf("\t\t1、初始操作\n");
  printf("\t\t2、新增操作\n");              //为什么不能在这里定义head指针---由于每次调用功能函数后,head指针又被又一次初始化了    
  printf("\t\t3、删除操作\n");
  printf("\t\t4、查找操作\n");
  printf("\t\t5、改动操作\n");
  printf("\t\t6、销毁操作\n");
  printf("\t\t7、求长操作\n");
  printf("\t\t8、打印操作\n");
  printf("\t\t9、退出程序\n");
  printf("请输入你所须要完毕的指令:\n");
  do{
    scanf("%d",&n);
    if(n<1||n>9)
      printf("对不起。你输入的指令编号是无效的。请又一次输入!!!\n");
  }while(n<1||n>9);
  switch(n)
  {
    case 1:
      Init_Dlist(head);            //初始化操作
      printf("已完毕双向链表初始化,请输入你要加入的元素个数!\n");
      scanf("%d",&n);
      while(n--)
      {
        int x;
        scanf("%d",&x);
        Insert_Dlist(head,x);
      }
      printf("完毕建表操作!\n");
      break;
    case 2:                                  //新增操作
      if(!head)
      {
        printf("对不起,请先完毕初始化操作再做该选择!!!\n");
        break;
      }
      printf("请输入你要加入的元素个数!\n");
      scanf("%d",&n);
      while(n--)
      {
        int x;
        scanf("%d",&x);
        Insert_Dlist(head,x);
      }
      printf("增添成功!\n");
      break;
    case 3:
      printf("请输入你所要删除的节点的位置:\n");
      scanf("%d",&n);
      Delete_Dlist(head,n);                             //删除操作
      break;
    case 4:
      printf("请输入你所要查找的元素:\n");
      scanf("%d",&m);
      Insearch_Dlist(head,m);                       //查找操作 
      break;
    case 5:
      if(Empty_Dlist(head))
      {
        printf("对不起,链表是空的,无法完毕改动操作!!!\n");
        break ;
      }
      printf("请输入你要更改的元素队列位置:\n");          //改动操作 
      do{
        scanf("%d",&a);
        if(a<1||a>Length_Dlist(head))
          printf("对不起。你所输入的元素位置不在区域内,请又一次输入!!!\n");
      }while(a<1||a>Length_Dlist(head));
      printf("请输入改动后的值:\n");
      scanf("%d",&b);
      Modify_Dlist(head,a,b);
      break;
    case 6:
      Destory_Dlist(head);            //销毁操作 
      break;
    case 7:
      len1=Length_Dlist(head);             //返回链长操作 
      printf("当前链队列的长度为:%d\n",len1);
      break;
    case 8:
      Print_Dlist(head);        //打印操作 
      break;
    case 9:                   //退出操作 
      return;
    default:
      instruction(head);
      break;
  }
  instruction(head);
}      

继续阅读