C语言,单链表操作(增删改查)(version 0.1)
这天要面试,提前把链表操作重新写了一遍。备份一下,以备不时之需。
希望有人能看到这篇代码,并指正。
// File Name : list.h
#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
#include "string.h" //creat list
//creat node
//insert
//del
//find
//sort
typedef int data_t ;
typedef struct NODE{
data_t data;
NODE* next;
}NODE ,*NODEPTR; typedef struct LIST{
NODE* head;//init==0
NODE* tail;//init==0
int num ; //min==0
}LIST; //create
extern NODE *create_node(data_t data);
extern LIST *creat_list();
extern bool is_null(LIST* list);
//find
extern NODE* find_node(LIST* list ,data_t data);
extern NODE* inline find_node_by_index(LIST* list , int index);//index : from 1 to list->num //del
extern int del_node_data(LIST* list,data_t data);
extern data_t del_node_head(LIST* list );
extern data_t del_node_index(LIST* list,int index);//index : from 1 to list->num
extern data_t del_node_tail(LIST* list ); //insert
extern int insert_data_F(LIST* list, data_t data);
extern void insert_node_F(LIST* list, NODE* node);
extern int insert_data_T(LIST* list, data_t data);
extern void insert_node_T(LIST* list, NODE* node );
extern int insert_data_index(LIST* list , data_t data,int index);//index : from 1 to list->num
extern int insert_node_index(LIST* list , NODE* node,int index);//index : from 1 to list->num extern int insert_data_ordered(LIST* list , data_t data );//assume the list is ordered (low to high )
//sort
extern int sort(LIST* list);
extern int swap(LIST* list, int indexf,int indexn);//index : from 1 to list->num
extern int inline swap_node(NODE* before ,NODE* next);
/****************************************************************************** Copyright (C), 2001-2011, DCN Co., Ltd. ******************************************************************************
File Name : list.c
Version : Initial Draft
Author : ocj
Created : 2014/8/8
Last Modified :
Description : singlelist
Function List :
create_node
creat_list
del_node_data
del_node_head
del_node_index
del_node_tail
find_node
find_node_by_index
insert_data_F
insert_data_index
insert_data_ordered
insert_data_T
insert_node_F
insert_node_index
insert_node_T
is_null
sort
swap
swap_node
History :
1.Date : 2014/8/8
Author : ocj
Modification: Created file ******************************************************************************/
#include "list.h"
//if success :ret!=0
LIST *creat_list()
{
LIST* list = (LIST*)malloc(sizeof(LIST));
list->head = ;
list->tail = ;
list->num = ;
return list;
}
//if success :ret!=0
NODE *create_node(data_t data)
{
NODE* node = (NODE*)malloc(sizeof(NODE));
node->dext = ;
node.data = data;
return node;
} //return 1: is null
//return 0: not null
bool is_null(LIST* list)
{
//return (list->num==0); //method 1
return (list->head->next == ) ;//method 2
} //ret==0:fail
int insert_node_F(LIST* list, NODE* node)
{
if(list== || node ==){
return ;
}
if(list->head==){
list->tail = node;
}
list->head = node ;
node->next = list->head;
//if list is null ,node->next == list->head==0
//if list is not null ,node->next == list->head!=0
list->num++;
} //return 1 : ok
//return 0 : fail
int insert_data_F(LIST* list, data_t data)
{
NODE* node = create_node(data);
if(node){
return ;
}
insert_node_F(list , node);
return ;
} void insert_node_T(LIST* list, NODE* node )
{
if(list->head==){
node->next = ;
list->head = list->tail = node;
} list->tail = node ;
node->next = ;
list->num++;
} //return 1 : ok
//return 0 : fail
int insert_data_T(LIST* list, data_t data)
{
NODE* node = create_node(data);
if(node){
return ;
}
insert_node_T(list , node);
return ;
} //ret=0: fail
int insert_node_index(LIST* list , NODE* node,int index)
{
if(index>listnum+) {
return ;
} if(index==){
insert_node_F(list ,node);
}else if(index ==list->num+){
insert_node_T(list ,node);
}else{
NODE* before = list->head;
while(index>){
index--;
before = before->next;
}
node->next = before->next ;
before->next = node ;
list->num++;
}
return ;
}
//ret=0: fail
int insert_data_index(LIST* list , data_t data,int index)
{
NODE* node = create_node(data) ;
if(node==null){
return ;
}
return insert_node_index(list , node,index );
} //assume the order is low to high
//ret==0: fail
int insert_data_ordered(LIST* list , data_t data )
{
NODE* node = create_node(data);
if(node==){
return ;
}
if(list->head == ){
list->head = list->tail = node;
return ;
} if(node->data < head->data){
insert_data_F(list ,node);
}else {
list->num++;
NODE *before = head;
NODE* nodet = head->next ;
while(node->data > nodet->data && nodet->next!=){
//until( node->data < nodet->data || tail )
nodet = nodet->next ;
before = before->next;
}
if(nodet->next==){
nodet->next = node ;
}else{
node->next = nodet ;
before->next = node ;
}
}
return ;
} //not find: return 0
//success find and del :return 1
int del_node_data(LIST* list,data_t data) //find and del first_found
{
if(list->num ==){
return ;
} NODE* before = list->head ;
NODE* nodet = list->head ;
if(nodet->data == data){ //head->data == data
list->head = list->head->next ;
free(nodet);
list->num--;
return ;
} nodet = nodet->next;
while(nodet->data!=data && nodet->next!= ){
nodet = nodet->next;
}
if(nodet->data == data ){
before->next = nodet->next ;
free(nodet);
list->num--;
}else{//not found
return ;
}
return ;
} data_t del_node_index(LIST* list,int index)
{
if(is_null(list) || index > list->num){
exit(-);
}
NODE* before = list->head ;
NODE* del = list->head ;
data_t data ;
if(list->num == ) { //head
list->num--;
list->head = list->tail = ;
data = del->data;
free(del);
return data;
} int first = ;
for( ;index>;index--){//offset --- index
if(!first){
before = before->next ;
}
first = ;
del = del->next;
} before->next = del->next ;
data = del->data;
if(del==list->tail){
list->tail = before ;
}
free(del);
list->num--;
return data; }
data_t del_node_head(LIST* list )
{
if(is_null(list)){
exit(-) ;
}
data_t data ;
NODE* del = list->head ;
list->head = list->head->next ;
free(del);
list->num--;
return data;
}
data_t del_node_tail(LIST* list )
{
if(is_null(list)){
exit(-) ;
}
NODE *before = list->head ;
data_t data = list->tail->data; if(list->num ==){
list->head = list->tail = ;
list->num--;
free(before);
return data ;
} while(before->next!= && before->next->next != ) {
before = before->next ;
} list->tail = before;
list->num--;
free(before->next);
return data ;
} //return 0: fail to find
//return node* : node first_found
NODE* find_node(LIST* list ,data_t data)
{
if(is_null(list)){
return ;
} NODE* nodet = list->head;
do{
if(nodet->data == data)
return nodet;
}while(nodet->next!=); return ;
} //head_index == 1;
//return 0: fail to find
//return node* : node first_found
NODE* inline find_node_by_index(LIST* list , int index)
{
if(list== || list->num == || index > list->num){
return ;
}
NODE* find = list->head;
while(--index){
find =find->next;
}
return find ;
} int swap(LIST* list, int indexf,int indexn)
{
NODE* nodef = find_node( list , indexf ) ;
NODE* noden = find_node( list , indexn ) ;
data_t swp = nodef->data;
nodef->data = noden->data;
noden->data = swp->data;
} //ret==0 : fail
int inline swap_node(NODE* before ,NODE* next)
{
if(before == ||next == ){
return ;
}
before->data ^=next->data ;
next->data ^=before->data ;
before->data ^=next->data ;
} //asume from little to big
int sort(LIST* list)
{
int times;
int index;
NODE* before = list->head;
NODE* next = ;
if(list==){
return ;
}
if(list->num==){
return ;
}
for(times=;times<list->num ;times++){
for(index=;index<=size-times;index++){
before = find_node_by_index(list ,index);
next = before->next;
if(next->data<before->data){
//before->data = before->data^ next->data ;
//nexty->data = before->data^ next->data ;
//before->data = before->data^ next->data ;
swap_node(before , next);
}
}
return ;
}
C语言,单链表操作(增删改查)(version 0.1)的更多相关文章
- 关于单链表的增删改查方法的递归实现(JAVA语言实现)
因为在学习数据结构,准备把java的集合框架底层源码,好好的过一遍,所以先按照自己的想法把单链表的类给写出来了; 写该类的目的: 1.练习递归 2.为深入理解java集合框架底层源码打好基础 学习的视 ...
- Django学习笔记--数据库中的单表操作----增删改查
1.Django数据库中的增删改查 1.添加表和字段 # 创建的表的名字为app的名称拼接类名 class User(models.Model): # id字段 自增 是主键 id = models. ...
- 史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言)
目录 1.准备工作 2.创建链表 3.打印链表 4.在元素后面插入元素 5.在元素前面增加元素 6.删除链表元素,要注意删除链表尾还是链表头 7.根据传入的数值查询链表 8.修改链表元素 9.求链表长 ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
- python全栈开发day61-django简单的出版社网站展示,添加,删除,编辑(单表的增删改查)
day61 django内容回顾: 1. 下载: pip install django==1.11.14 pip install -i 源 django==1.11.14 pycharm 2. 创建项 ...
- Hbase常用操作(增删改查)
Hbase常用操作(增删改查) [日期:2014-01-03] 来源:Linux社区 作者:net19880504 [字体:大 中 小] 运行Eclipse,创建一个新的Java工程“HBa ...
- Android-Sqlite-OOP方式操作增删改查
之前写的数据库增删改查,是使用SQL语句来实现的,Google 就为Android开发人员考虑,就算不会SQL语句也能实现增删改查,所以就有了OOP面向对象的增删改查方式 其实这种OOP面向对象的增删 ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删改查),事件
JavaScript---Dom树详解,节点查找方式(直接(id,class,tag),间接(父子,兄弟)),节点操作(增删改查,赋值节点,替换节点,),节点属性操作(增删改查),节点文本的操作(增删 ...
- java实现单链表的增删改以及排序
使用java代码模拟单链表的增删改以及排序功能 代码如下: package com.seizedays.linked_list; public class SingleLinkedListDemo { ...
随机推荐
- js限制图片的大小
<form id="financialForm" action="<%=basePath%>riskcontrol/website/review_bor ...
- kafka集群配置与测试
刚接触一些Apache Kafka的内容,用了两天时间研究了一下,仅以此文做相关记录,以供学习交流. 概念: kafka依赖的项: 1. 硬件上,kafka利用线性存储来进行硬盘直接读写. 2. k ...
- 关于switch的思考和总结
1.通常每个case的末尾都应该加个break; 否则会default分支也会被执行 var score = 40;switch (score){case 50:console.log('50');/ ...
- 射频识别技术漫谈(19)——Desfire的3次握手认证和段密码生成
3次握手认证并生成临时的通讯密钥在通讯技术中的应用非常普遍,Mifare Desfire也使用了这种成熟的认证加密方法.Desfire在卡片数据传输前使用DES或3DES进行3次握手认证,认证成功一方 ...
- Nginx 的 Echo 模块 —— echo-nginx-module(转)
Nginx 有个 echo 模块可以用来输出一些简单的信息,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...
- Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释
@jsonignore的作用作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. http://www.cnblogs.com/toSeeMyDream/p/443 ...
- android中文字高亮设置案例
在android中我们有时候需要对一些标示性的文字进行高亮[用不同的颜色显示],例如微博中的@**等等...这些特效是通过SpannableString这个类来实现的 思路是将要显示的string进行 ...
- Android 关于调用系统内已安装的相机问题
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,1); 调用系统内已安 ...
- Java-多线程的实现与启动
class mythread extends Thread //多线程的启动 { private String name; public mythread(String name) { t ...
- Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 一个相对完善的自定义控件在布局文件中和java ...