C数据结构之双链表详细示例分析

所属分类: 软件编程 / C 语言 阅读数: 56
收藏 0 赞 0 分享
复制代码 代码如下:

 typedef struct node
{
      struct node *prior;
      struct node *next;
       int num;
}NODE;
/*******双向链表的初始化********/
NODE *Init_link(void)
{
     int i;
     NODE *phead,*pb,*pi;
     phead = (NODE *)malloc(sizeof(NODE));
     printf("please input num:\n");
     scanf("%d",&(phead->num));
     phead->prior = NULL;
     phead->next = NULL;
     pb = phead;
     for(i=0; i<3; i++)
     {
          pi = (NODE *)malloc(sizeof(NODE));
          printf("please input num:\n");
              scanf("%d",&(pi->num));
          pi->next = NULL;
          pb->next = pi;
          pi->prior = pb;
          pb = pi;
     }
     return phead;
}
/******链表的输出******/
void print_link(NODE *phead)
{
 while(phead != NULL)
 {
  printf(" %d,",phead->num);
  phead = phead->next;
 }
 printf("\n");
}
/******链表的逆序******/
NODE *reverse_link(NODE *phead)
{
 NODE *pb,*pf,*temp;
 pb = phead;
 pf = pb->next;
 while(pf != NULL)
 {
  temp = pf->next;
  pf->next = pb;
  pb->prior = pf;
  pb = pf;
  pf = temp;
 }
// phead->prior = pf->prior;
 phead->next = NULL;
 phead = pb;
 return phead;
}
/*****链表的排序*****/
NODE *Order_link(NODE *phead)
{
     NODE *pb,*pf,*ptr,temp;
     pb = phead;
     while(pb->next != NULL)
     {
          pf = pb->next;
          while(pf != NULL)
          {
               if(pb->num > pf->num)
               {
                     temp = *pb;
                    *pb = *pf;
                    *pf = temp;
                     ptr = pb->next;
                     pb->next = pf->next;
                     pf->next = ptr;
                     ptr = pb->prior;
                     pb->prior = pf->prior;
                     pf->prior = ptr;
              }
             pf = pf->next;
        }
        pb = pb->next;
    }
    return phead;
}
/******链表的有序插入*****/
NODE *insert_link(NODE *phead,NODE *pi)
{
 NODE *pb,*pf;
 pb = phead;
 if(pi == NULL)
  return phead;
 if(phead == NULL)
 {
  phead = pi;
  pi->prior = NULL;
  pi->next =NULL;
 }
 else
 {
  while( (pi->num > pb->num)&&(pb->next!=NULL))
  {
   pf = pb;
   pb = pb->next;
  }
  if(pi->num <= pb->num)
  {
   if(pb == phead)
   {
    pi->next = phead;
    pi->prior = NULL;
    phead->prior = pi;
    phead = pi;
   }
   else
   {
    pi->next = pb;
    pb->prior = pi;
    pi->prior = pf;
    pf->next = pi;
   }
  }
  else
  {
   pi->next = NULL;
   pi->prior = pb;
   pb->next = pi;
  }
 }
 return phead;
}
/******链表的删除*****/
NODE *delete_link(NODE *phead, NODE *pi)
{
 NODE *pb,*pf;
 pb = phead;
 while(pb != NULL)
 {
  if(pb == pi)
  {
   if(pb == phead)
    phead = phead->next;
   else if(pb->next == NULL)
    pf->next = NULL;
   else
   {
    pf->next = pb->next;
    //pb->next->prior = pf;
   }
  }
  pf = pb;
  pb = pb->next;
 }
 return phead;
}
/*******链表的释放******/
void free_link(NODE *phead)
{
 NODE *pb;
 while(phead != NULL)
 {
  pb = phead->next;
  free(phead);
  phead = pb;
 }
 printf("released link success!\n");
}
/*******测试程序******/
int main(void)
{
 NODE *phead,*pi;
 phead = Init_link();
 printf("init link:\n");
 print_link(phead);

 pi = (NODE *)malloc(sizeof(NODE));
 printf("plaese input insert num:");
 scanf("%d",&(pi->num));
 phead = insert_link(phead,pi);
 printf("after insert link:\n");
 print_link(phead);
 phead = Order_link(phead);
 printf("after sort link:\n");
 print_link(phead);

 printf("after reverse link:\n");
 phead = reverse_link(phead);
 print_link(phead);
 phead = delete_link(phead, pi);
 printf("after delete link:\n");
 print_link(phead);
 free_link(phead);
 return 0;
}
更多精彩内容其他人还在看

C++无法重载点符号、::、sizeof等的原因

这篇文章主要介绍了C++无法重载点符号、::、sizeof等的原因的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

实例讲解C语言编程中的结构体对齐

这篇文章主要介绍了C语言编程中的结构体对齐,值得注意的是一些结构体对齐的例子在不同编译器下结果可能会不同,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言的结构体中成员变量偏移问题

这篇文章主要介绍了C语言的结构体中成员变量偏移问题,以讲解如何编写宏来对成员变量进行修改为主,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言结构体中的函数指针

这篇文章主要介绍了详解C语言结构体中的函数指针,文中对函数指针的基本概念也有讲解,需要的朋友可以参考下
收藏 0 赞 0 分享

C++编程中的函数指针初步解析

这篇文章主要介绍了C++编程中的函数指针初步解析,函数指针在C语言和C++学习中都是非常重要的知识,需要的朋友可以参考下
收藏 0 赞 0 分享

实例解析C++中类的成员函数指针

这篇文章主要介绍了C++中类的成员函数指针,例子中以讨论用函数指针调用类的成员函数为主,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的函数指针基础学习教程

这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
收藏 0 赞 0 分享

深入解析C语言中函数指针的定义与使用

这篇文章主要介绍了C语言中函数指针的定义与使用,是C语言入门学习中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

详解C语言编程中的函数指针以及函数回调

这篇文章主要介绍了C语言编程中的函数指针以及函数回调,函数回调实际上就是让函数指针作函数参数、调用时传入函数地址,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言中的函数指针学习笔记

这篇文章主要介绍了C语言中的函数指针的一些学习知识点记录,文中作者整理了一些比较interesting的函数指针用法,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多