文档章节

双向链表小练习-》拿单向链表改的,其中增加了一个链表排序的小应用

Palmer神经质
 Palmer神经质
发布于 2014/04/08 15:37
字数 812
阅读 112
收藏 5
/*************************************************************************
    > File Name: duplex.h
    > Author: Palmer XU
    > Mail:  
    > Created Time: Thu 03 Apr 2014 11:38:06 PM EDT
 ************************************************************************/

#ifndef __DUPLEX_H__
#define __DUPLEX_H__

#include<stdio.h>

typedef struct node
{
 int data;
 struct node *next;
 struct node *before;
}node_t,*pnode_t;

pnode_t creat_list();//创建链表头

pnode_t creat_node(int);//创建节点

int insert_after_all(pnode_t,int);//在链表的最后创建节点
#if 1
int insert_after(pnode_t,int);//在链表指定节点后插入节点
#endif
int print_all_inturn(pnode_t);//顺序打印节点
int print_all_uninturn(pnode_t);//逆序打印节点
int delete_node(pnode_t,int);//删除指定节点
int delete_after(pnode_t);//删除指定节点后面的节点
int delete_before(pnode_t);//删除指定节点前面的节点
pnode_t find_node(pnode_t,int);//找到节点

pnode_t destory_all(pnode_t);//删除链表

int sort_list(pnode_t);//排序

#endif

/*************************************************************************
    > File Name: duplex.c
    > Author: Palmer XU
    > Mail:  
    > Created Time: Mon 07 Apr 2014 10:38:44 PM EDT
 ************************************************************************/

#include<stdio.h>
#include"duplex.h"
#include<time.h>
#include<stdlib.h>
int main(void)
{
 pnode_t p;
 int i = 0;
 p = creat_list();
 for(i = 1; i <= 10; i++)
  insert_after_all(p,i);
 print_all_inturn(p);
 insert_after(find_node(p,3),100);
 print_all_uninturn(p);
 delete_after(find_node(p,7));
 print_all_uninturn(p);
 delete_node(p,1);
 print_all_uninturn(p);
 sort_list(p);
 print_all_inturn(p);
 print_all_uninturn(p);
 destory_all(p);
 
 pnode_t fp;
 fp = creat_list();
 srand(time(NULL));
 for(i = 0; i < 10; i++)
 {
  insert_after(fp,rand()%100);
 }
 print_all_inturn(fp);
 sort_list(fp);
 print_all_inturn(fp);
 destory_all(fp);

 return 0;
}

/*************************************************************************
    > File Name: duplex_fun.c
    > Author: Palmer XU
    > Mail:  
    > Created Time: Fri 04 Apr 2014 02:07:09 AM EDT
 ************************************************************************/

#include<stdlib.h>
#include<stdio.h>
#include"duplex.h"

pnode_t creat_list()
{
 pnode_t p_head = (pnode_t)malloc(sizeof(node_t));
 pnode_t p_tail = (pnode_t)malloc(sizeof(node_t));
 p_head->data = -999999;
 p_head->next = p_tail;
 p_head->before = NULL;
 p_tail->data = 999999;
 p_tail->next = NULL;
 p_tail->before = p_head;
 
 return p_head;
}

pnode_t creat_node(int data)
{
 pnode_t p = (pnode_t)malloc(sizeof(node_t));
 
 p->data = data;
 p->next = NULL;
 p->before = NULL;

 return p;
}

int insert_after_all(pnode_t p,int n_p)
{
 if(NULL == p)
 {
  printf("error\n");
  return -1;
 }
 while(NULL != p->next)
  p = p->next;
 pnode_t p_temp = p->before;
 p->before = creat_node(n_p);
 p->before->next = p;
 p->before->before = p_temp;
 p->before->before->next = p->before;

 return 0;
}
#if 1
int insert_after(pnode_t p,int n_p)
{
 
 if(NULL == p)
 {
  printf("error\n");
  return -1;
 }

 pnode_t p_temp;
 p_temp = creat_node(n_p);
 p_temp->next = p->next;
 p_temp->before = p;
 p->next->before = p_temp;
 p->next = p_temp;

 return 0;
}
#endif

int print_all_inturn(pnode_t p)
{ 
 if(NULL == p)
 {
  printf("error\n");
  return -1;
 }
 while(NULL != (p = p->next) && NULL != p->next)
  printf("%d\t",p->data);
 printf("\n");

 return 0;
}

int print_all_uninturn(pnode_t p)
{ 
 if(NULL == p)
 {
  printf("error\n");
  return -1;
 }
 while(NULL != (p = p->next) && NULL != p->next);
 while(NULL != (p = p->before) && NULL != p->before)
  printf("%d\t",p->data);
 printf("\n");

 return 0;
}

pnode_t find_node(pnode_t p,int n_p)
{ 
 if(NULL == p)
 {
  printf("error\n");
  return NULL;
 }
 while(NULL != (p = p->next) && p->data != n_p);

 return p;
}

int delete_after(pnode_t p)
{
 if(NULL == p || NULL == p->next )
 {
  printf("error\n");
  return -1;
 }

 if(NULL == p->next->next)
 {
  printf("error- -the last\n");
  return -1;
 }
 pnode_t p_temp = p->next;
 p_temp->next->before = p;
 p->next = p->next->next;
 free(p_temp);

 return 0;
}

int delete_node(pnode_t p, int data)
{
 if(NULL == p)
 {
  printf("error\n");
  return -1;
 }
#if 1
 while(NULL != p->next && data != p->next->data)
 {
  p = p->next;
 }
#endif
 
 if(NULL != p->next && -1 != delete_after(p))
   return 0;
 printf("error\n");
 return -1;
}

pnode_t destory_all(pnode_t p)
{
 if(NULL == p)
 {
  printf("error\n");
  return NULL;
 }

 pnode_t p_temp;
 
 while(NULL != (p_temp = p))
 {
  p = p->next;
  free(p_temp);
 }

 return NULL;
}

int delete_before(pnode_t p)
{
 if(NULL == p || NULL == p->next )
 {
  printf("error\n");
  return -1;
 }
 if(NULL == p->before->before)
 {
  printf("error- -the first\n");
  return -1;
 }
 pnode_t p_temp = p->before;
 p_temp->before->next = p;
 p->before = p->before->before;
 free(p_temp);

 return 0;
}

int sort_list(pnode_t p)
{
 if(NULL == p || NULL == p->next )
 {
  printf("error\n");
  return -1;
 }
 int i,num;
 pnode_t p_temp = p;
 while(NULL != (p = p_temp->next) && NULL != p->next)
 {
  p_temp = p_temp->next;
  while(NULL != (p = p->next) && NULL != p->next)
  {
   if(p_temp->data > p->data)
   { 
    num = p->data;
    p->data = p_temp->data;
    p_temp->data = num;
   }
  }
 }
 
 return 0;
 
}

© 著作权归作者所有

Palmer神经质
粉丝 0
博文 9
码字总数 3660
作品 0
杭州
程序员
私信 提问
JavaScript数据结构 之 链表

一、什么是链表  链表是一种链式存储的线性表,是由一组节点组成的集合,每一个节点都存储了下一个节点的地址;指向另一个节点的引用叫链;和数组中的元素内存地址是连续的相比,链表中的所...

TDX
06/26
0
0
Java集合系列之LinkedHashMap

Java集合系列之LinkedHashMap Hello,大家好,前面给大家讲了HashMap,LinkedList,知道了HashMap为数组+单向链表,LinkedList为双向链表实现的。今天给大家介绍一个(HashMap+"LinkedList")的集...

2018/01/03
0
0
JS数据结构第三篇---双向链表和循环链表之约瑟夫问题

一、双向链表 在上文《JS数据结构第二篇---链表》中描述的是单向链表。单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点...

TDX
06/26
0
0
JS数据结构第三篇---双向链表和循环链表

一、双向链表 在上文《JS数据结构第二篇---链表》中描述的是单向链表。单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点...

TDX
06/26
0
0
iOS-数据结构之链表以及二叉树

(一)前言 对于频繁使用或者是操作的数据应当使用链表,提升效率; (1)链表的优点:链表插入和删除节点付出的代价较小,主要的操作在于prev或next指针的重指向。缺点:链表不能通过下标或...

麦兜卖鱼丸
2016/11/07
124
2

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
10
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
23
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部