双链表 c teacher-double-nohead-noloop
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

typedef struct girl {
char name[30];
int bra;
int beautiful;
} girl_t ;

void input_girl( girl_t * girl )
{
printf("Input girl name: ");
gets( girl->name );
printf("Input gril bra: ");
scanf("%d", &girl->bra );
printf("Input girl beautiful: ");
scanf("%d", &girl->beautiful );
getchar();
}

void print_girl( void * data )
{
girl_t * girl = ( girl_t * ) data;
printf("girl name: %s\n", girl->name );
printf("girl bra: %d\n", girl->bra );
printf("girl beautiful: %d\n\n", girl->beautiful );
}

int del_condition( void * data )
{
girl_t * girl = ( girl_t * ) data;
if( girl->bra > 80 || girl->bra < 40 || girl->beautiful < 6 )
return 1;
return 0;
}

int compare( void * data1, void * data2 )
{
girl_t * girl1 = ( girl_t * )data1;
girl_t * girl2 = ( girl_t * )data2;

if( girl1->beautiful > girl2->beautiful )
return -1;
return 1;
}

void menu( void )
{
printf("(1) insert from end .\n");
printf("(2) delete a node .\n");
printf("(3) sort list.\n" );
printf("(4) print list .\n");
printf("(5) save file.\n");
printf("(6) load file.\n");
printf("(0) exit.\n");
printf("Choice: ");
}

int main( int argc, char ** argv )
{
node_t * head = NULL;
char filename[30];

while( 1 ) {
menu();
int choice;
girl_t girl;

scanf( "%d", &choice );
getchar();
switch( choice ){
case 0:
destroy_list( &head );
exit( 0 );
case 1:
input_girl( &girl );
insert_node( &head, &girl, sizeof(girl_t) );
break;
case 2:
del_node( &head, del_condition );
break;
case 3:
sort_node( head, compare );
break;
case 4:
print_list( head, print_girl );
break;
case 5:
printf("Save as: ");
gets( filename );
save_list( head, sizeof(girl_t), filename );
break;
case 6:
printf("Input the filename: ");
gets( filename );
load_list( &head, sizeof(girl_t), filename );
break;
default:
printf("choice error.\n");
break;
}
}

return 0;
}

list.h
#ifndef _GEN_NOLOOP_SINGLE_
#define _GEN_NOLOOP_SINGLE_

typedef struct node node_t;
struct node {
void * data;
node_t * pre;
node_t * next;
};

#define TYPE_LEN 4
#define TYPE_NAME "LIST"

int length( node_t * head );
node_t * get_num( node_t * head, int num );
int insert_node( node_t ** head, void * data, int data_len );
int del_node( node_t ** head, int ( * condition )( void * ) );
int sort_node( node_t * head, int ( * compare )( void *, void * ) );
int print_list( node_t * head, void ( * print )( void * data ) );
int destroy_list( node_t ** head );
int save_list( node_t * head, int data_len, char * filename );
int load_list( node_t ** head, int data_len, char * filename );
#endif /* _GEN_NOLOOP_SINGLE_ */

list.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

int insert_node( node_t ** head, void * data, int data_len )
{
node_t * node = ( node_t * )malloc( sizeof(node_t) );
node->data = malloc( data_len );
memcpy( node->data, data, data_len );
node->pre = NULL;

if( *head == NULL ) {
*head = node;
(*head)->next = NULL;
} else {
(*head)->pre = node;
node->next = *head;
*head = node;
}
}

int del_node( node_t ** head, int ( * condition )( void * ) )
{
node_t * temp = *head;

while( temp != NULL ) {
int ret = condition( temp->data );
if( ret == 1 ) {
if( temp == *head ) {
*head = temp->next;
free( temp->data );
free( temp );
if( *head != NULL )
(*head)->pre = NULL;
temp = *head;
} else {
node_t * temp_next = temp->next;
if( temp->next != NULL )
temp->next->pre = temp->pre;
temp->pre->next = temp->next;
free( temp->data );
free( temp );
temp = temp_next;
}
} else {
temp = temp->next;
}
}
}

node_t * get_num( node_t * head, int num )
{
while( head != NULL ) {
if( num -- == 0 )
return head;
head = head->next;
}

return NULL;
}

int length( node_t * head )
{
int i = 0;
while( head != NULL ) {
++ i;
head = head->next;
}
return i;
}

int sort_node( node_t * head, int ( * compare )( void *, void * ) )
{
node_t * temp = head;
int len = length( head );

int i, j;

for( i=0; i<len-1; ++i )
for( j=0; j<len-1-i; ++j ){
node_t * n1 = get_num( head, j );
node_t * n2 = get_num( head, j+1 );
int ret = compare( n1->data, n2->data );
if( ret > 0 ) {
void * temp_data;
temp_data = n1->data;
n1->data = n2->data;
n2->data = temp_data;
}
}
return 0;
}

int merge_list( node_t ** head1, node_t * head2 )
{
if( *head1 == NULL ) {
*head1 = head2;
} else {
if( head2 != NULL ) {
node_t * temp = *head1;
while( temp->next != NULL )
temp = temp->next;
temp->next = head2;
head2->pre = temp;
}
}
}

int print_list( node_t * head, void ( * print )( void * ) )
{
while( head != NULL ) {
print( head->data );
head = head->next;
}
}

int destroy_list( node_t ** head )
{
node_t * temp = *head;

while( temp != NULL ) {
temp = temp->next;
free( (*head)->data );
free( (*head) );
*head = temp;
}
return 0;
}

int save_list( node_t * head, int data_len , char * filename )
{
FILE * fp = fopen( filename, "wb" );
if( fp == NULL ) {
perror( "fopen" );
exit( 1 );
}

char magic[ TYPE_LEN + 1 ] = TYPE_NAME;
fwrite( magic, 4, 1, fp );

int ret;
while( head != NULL ) {
ret = fwrite( head->data, data_len, 1, fp );
if( ret != 1 )
continue;
head = head->next;
}
fclose( fp );
}

int load_list( node_t ** head, int data_len, char * filename )
{
FILE * fp = fopen( filename, "rb" );
if( fp == NULL ) {
perror( "fopen" );
return -1;
}

char * buf = ( char * )malloc( TYPE_LEN );
fread( buf, TYPE_LEN, 1, fp );
if( strncmp( buf, TYPE_NAME, 4 ) != 0 ) {
printf("Can't parse the file type.\n");
return -1;
}

destroy_list( head );

int ret;
void * data_buf = malloc( data_len );
while( feof( fp ) == 0 ) {
ret = fread( data_buf, data_len, 1, fp );
if( ret != 1 )
continue;
insert_node( head, data_buf, data_len );
}
fclose( fp );
}

Makefile
all: main

main: main.c list.c list.h Makefile
gcc -o main main.c list.c -g

双链表 c teacher-double-nohead-noloop相关推荐

  1. Java数据结构和算法:数组、单链表、双链表

    1. 概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的 ...

  2. 笨办法学 Python · 续 练习 14:双链表

    练习 14:双链表 原文:Exercise 14: Double Linked Lists 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 以前的练习可能需要花一段时间才能完成, ...

  3. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

  4. c语言 双向链表增删修查,手写双链表,并实现增删改查

    手写双链表,并实现增删改查 public class DoublyLinkedListT { // 一个空的头节点 private final Node head = new Node(null); ...

  5. 读书笔记 ——《系统程序员成长计划》篇3:双链表

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  6. Go 学习笔记(80)— Go 标准库 container/list(单链表、双链表)

    列表是一种非连续存储的容器,由多个节点组成,节点通过一些变量记录彼此之间的关系.列表有多种实现方法,如单链表.双链表等. ​ 在 Go 语言中,将列表使用 container/list 包来实现,内部 ...

  7. 利用“哨兵”“实现双链表

    利用"哨兵""实现双链表 下面的代码用一个"哨兵"实现双链表,感觉很简洁,中间也有点绕,暂时实现,供学习之用 static Node list_han ...

  8. 一级指针和二级指以及(void**)在双链表中的应用

    因为函数参数是按值传递的,所以要想改变变量,必须传递地址. 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**. (void**)&必须是本质上就是指针变量的地址才可以做这 ...

  9. 结构体的两种声明方式:堆上和栈上以及在双链表的应用

    在看<算法精解:C语言描述>的双链表chtbl和redis的双链表adlist.c发现代码思路基本是一致的. 但是,对于链表的初始化却不一样 1.<算法精解:C语言描述>风格 ...

  10. 【数据结构】双链表的应用

    1.设计一个算法,在双链表中值为y的结点前面插入一个值为x的新结点,即使得值为x的新结点成为值为y的结点的前驱结点. 2.设计一个算法,将一个双链表改建成一个循环双链表. #include <s ...

最新文章

  1. 【FFmpeg】使用sws_scale将AVFrame转换后的图像数据放入cv::Mat中
  2. 干掉Navicat:这个IDEA的兄弟真香!
  3. JavaScript学习笔记——对象知识点
  4. hdu 5280(最大子串和变形,dp)
  5. python学习——把计算GC含量的代码封装成函数
  6. springboot03-unittest mockmvc单元测试
  7. stm32 读取sd卡图片显示_全面测试雷克沙1667x 性能,你懂什么叫超高速SD卡吗
  8. ELK logstash gork匹配在线测试
  9. poi导出excel 并实现合并单元格
  10. Python 最频繁使用的4个函数:lambda、 map、filter 和 reduce
  11. 计算机程序c语言教材,C语言程序设计(高等学校计算机基础教育教材精选)
  12. 【安全知识分享】PPTX|精益安全管理(130页)(附下载)
  13. 解决Git克隆代码 the remote end hung up unexpectedly 错误
  14. Codejock Xtreme ToolkitPro 静态链接XTP库以及皮肤库的使用
  15. 基础实验5-2.2 电话聊天狂人(Map的使用+例题)
  16. 电脑查询域名对应IP的过程
  17. 微信域名防封,细说微信域名防封技术原理
  18. 信息学奥赛一本通——2066:【例2.3】买图书
  19. 普通话测试软件字体怎么调整,普通话考试常见问题解答
  20. My97DatePicker默认赋值

热门文章

  1. linux过滤某个mac的包,macOS 下使用 tcpdump 抓包
  2. python进入上下文管理器_浅谈Python中with(上下文管理器)的用法
  3. linux内存管理_架构师必读:Linux 的内存分页管理
  4. java生成点阵图_Android从SD卡读取图片并显示为点阵图
  5. C#中的IO流操作(FileStream)
  6. 一台服务器上使用docker安装redis6.0.10一主两从以及哨兵模式
  7. 风变Python6---布尔值,break,continue,pass,else等语句的学习
  8. 基于stm32智能风扇_意法半导体和Fieldscale为基于STM32的智能设备带来简单直观的触控体验...
  9. 如何实现降维处理(R语言)
  10. docker_6 Docker 网络