`
ccjsjymg
  • 浏览: 62095 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c语言单链表增删查

阅读更多
#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

typedef unsigned char DataType;

typedef struct NODE
{
	DataType c;
	struct NODE* next;
} LinkNode;

LinkNode* CreateLink(DataType* pCh);
LinkNode* FindLinkE(LinkNode* head, int nPos);
void InsertLinkE(LinkNode* head, int nPos, DataType insertData);
void DeleteLinkE(LinkNode* head, int nPos);
void FindData(LinkNode* head, DataType ch);
void InitData(LinkNode arrNode[], DataType* cData, int arrLen);
void CompareEffic(DataType* pCh, DataType ch);

#endif

/*
创建结点
*/
LinkNode* CreateLink(DataType* pCh)
{
	typedef LinkNode* linkList;
	LinkNode* head = NULL; //头指针
	linkList p1,p2; //p1是中间指针,p2是尾指针
	
	while(*pCh != 0)
	{
		p1 = (linkList)malloc(sizeof(LinkNode));
		p1->c = *pCh;
		if(NULL == head)
		{
			head = p1;
		}else
		{
			p2->next = p1;
		}
		p1->next = NULL;
		p2 = p1;
		++pCh;
	}

	return head;
}

/*
查找结点
*/
LinkNode* FindLinkE(LinkNode* head, int nPos)
{
	int i = 0;
	
	while(head->next && i < nPos)
	{
		head = head->next;
		++i;
	}

	if(i == nPos)//此时找到要找的结点
	{
		return head;
	}

	return NULL;
}

/*
插入结点
*/
void InsertLinkE(LinkNode* head, int nPos, DataType insertData)
{
	int i = 0;
	LinkNode* p1 = NULL;
	p1 = FindLinkE(head, nPos - 1);//找到插入当前结点的上个结点

	if(NULL == p1)
	{
		printf("对不起,操作有误!\n");
		Sleep(2000);
		throw "无效的数据";
	}
	//生成插入的结点
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	//初始化当前结点
	s->c = insertData;
	s->next = p1->next;//将s成员中的next指向将p1的后一个结点
	p1->next = s;

}

/*
删除结点
*/
void DeleteLinkE(LinkNode* head, int nPos)
{
	//找到删除结点
	LinkNode* delNode = FindLinkE(head, nPos);
	if(NULL == delNode)
	{
		printf("操作有误\n");
		exit(1);
	}
	//找到删除结点的上一个结点
	if(nPos < 1) return;
	LinkNode* p1 = FindLinkE(head, nPos - 1);
	if(NULL != p1)
	{
		p1->next = delNode->next;
	}

	free(delNode);//必须释放
}


/*
比较一下数组查找和链表查找效率问题
相同数据
*/

void CompareEffic(DataType* pCh, DataType ch)
{
	LinkNode arrNode[1000] = {0};
	LinkNode* head = CreateLink(pCh);
	InitData(arrNode, pCh, 255);
	
	//查找链表
	time_t t_link1 = time(NULL);
	tm* tm_link1 = localtime(&t_link1);
	int mill1 = tm_link1->tm_sec * 1000;

	FindData(head, ch);//查找元素位于结点上

	time_t t_link2 = time(NULL);
	tm* tm_link2 = localtime(&t_link2);
	int mill2 = tm_link2->tm_sec * 1000;
	//时间之差
	int link_result = mill2 - mill1;

	//查找数组
	time_t t_array1 = time(NULL);
	tm* tm_array1 = localtime(&t_array1);
	int millarray1 = tm_array1->tm_sec * 1000;

	for(int i = 0;i < 1000;++i)
	{
		if(arrNode[i].c == ch)
		{
			break;
		}
	}

	time_t t_array2 = time(NULL);
	tm* tm_array2 = localtime(&t_array2);
	int millarray2 = tm_array2->tm_sec * 1000;
	//时间之差
	int arr_result = millarray2 - millarray1;

	if(arr_result < link_result)
	{
		printf("数组查找速率快\n");
	}else
	{
		printf("数据太少,无法检测两者差异!\n");
	}
	
}

/*
初始化数组数据
*/
void InitData(LinkNode arrNode[], DataType* cData, int arrLen)
{
	int nCnt = 0;
	while(*cData != 0)
	{
		if(nCnt > arrLen - 1) break;
		arrNode->c = *cData;
		++cData;
		++nCnt;
	}
}

/*
查找指定数据
*/
void FindData(LinkNode* head, DataType ch)
{
	if(NULL == head) return;
	int i = 0; 
	while(head->next != NULL)
	{
		if(head->c == ch)
		{
			printf("查找到%c在当前结点位置%d\n", ch, i);
			break;
		}
		head = head->next;
		++i;
	}
}



分享到:
评论

相关推荐

    c语言 单链表的增删改查

    C语言编写的单链表增删改查,实现了单链表的增加,删除,修改,查询等功能

    单链表c语言实现增删改查操作

    这个项目"单链表c语言实现增删改查操作"是基于VS2008运行环境,用C语言编程实现对单链表的基本操作,包括插入、删除、修改和查询元素,并将结果输出到控制台。 首先,我们需要定义链表的节点结构: ```c typedef ...

    C语言实现单链表-增删改查.pdf

    ### C语言实现单链表-增删改查 #### 一、链表基本概念与特点 链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含两部分:数据域(存放实际数据)和指针域(指向下一个节点的地址)。与数组相比,...

    单链表的增删改查.c

    链表是一种常见的数据结构,资源包含了我对单链表的增删改查实现,本资源是不带头结点的单链表的增删改查,个人能力有限,希望指出不足之处,与大家共勉

    C语言实现单链表的增删查改

    本篇文章将深入探讨如何用C语言实现单链表的增、删、查、改四种基本操作。 ### 1. 单链表的基本结构 首先,我们需要定义一个链表节点结构体,如下所示: ```c typedef struct Node { int data; // 数据域,这里...

    C语言数据结构单链表的增删改查

    在这个主题中,我们将深入探讨"单链表"这种基本的数据结构以及在C语言中如何进行增删改查的操作。 单链表是一种线性数据结构,其中的元素(节点)通过指向下一个元素的指针连接在一起。每个节点包含两部分:数据域...

    C语言单链表实现初始化、创建、增、删、查等基本操作.txt

    c语言链表的基本操作

    C语言数据结构库(队列,栈,链表,树的增删改查)

    本资料包提供了一套完整的C语言数据结构库,特别关注于队列、栈、链表和树这四种基本数据结构的增删改查操作。 1. 队列:队列是一种先进先出(FIFO)的数据结构,类似于现实生活中的排队。在这个库中,你可以找到...

    数据结构单链表实验-增删查

    大三上学期数据结构第一次实验,内容: 1)数据文件为cet4word.txt,其中每行描述了一个词条,包含英文单词、词性及中文释义等属性 2)将每个词条定义为一个结构体 3)能够实现词典的装载、添加、删除、按英文单词...

    C语言之航空信息查询系统-使用双向循环链表实现系统的增删改查操作

    双向循环链表是一种特殊的链式存储结构,它允许我们在链表的两个方向上进行遍历,这对于执行增删改查操作非常有用。下面我们将详细探讨这个系统的设计与实现。 首先,我们要理解双向循环链表的基本概念。双向循环...

    员工管理系统(C语言)(单链表)

    1、实现软件:Dev-C++ 2、详细的测试页面可见我《资源》专栏下的《C语言系统资源测试》。 3、适合新手下载学习。...8、功能:增删改查(多途径删改查)、浏览、统计(统计超过平均工资的员工信息)

    C语言链表学生管理系统

    链表是计算机科学中重要的数据结构之一,它在内存中动态存储数据,具有灵活的增删改查能力。 首先,让我们深入理解链表的概念。链表不同于数组,数组是一段连续的内存空间,而链表中的元素(节点)在内存中可能是...

    c语言商品信息管理系统(c语言课程作业)

    C语言课程大作业,985高校c语言作业,商品信息管理系统,可以实现商品信息的录入,增删改查,附有收藏夹功能

    数据结构单链表C语言接口实现

    数据结构单链表C语言接口实现,实现其增删改查

    基于C的单链表的创建,以及对单链表的增、删、查、改、和打印等基本操作

    在C语言中,单链表的操作通常通过结构体和指针来实现。本主题将深入探讨如何使用C语言创建并操作单链表,包括链表的初始化、插入、删除、查找、修改和打印等基本功能。 首先,我们需要定义一个结构体来表示链表的...

    员工工资管理系统2(单链表)(C语言)

    1、实现软件:Dev-C++ 2、详细的测试页面可见我《资源》专栏下的《C语言系统资源测试》。 3、适合新手下载学习。 4、基于C语言的单链表实现。(没有带头节点) ...6、功能:增删改查排序浏览、指定位置插入

    用单链表存储的c语言控制台程序,基于visual编程

    本项目是一个基于Visual Studio的C语言控制台应用程序,实现了通讯录功能,包括增删改查、排序以及文件保存等操作。让我们深入探讨这些知识点。 首先,单链表是由一系列节点构成的数据结构,每个节点包含两部分:...

    C语言实例-双向链表增删改查

    双向链表(Doubly Linked List)是计算机科学中的一种基本数据结构,它在单链表的基础上扩展了数据节点的指针结构。与单链表仅包含一个指向下一个节点的指针不同,双向链表的每个节点包含两个指针:一个指向前一个...

    简单的学生信息管理 C语言实现

    接下来,我们实现增、删、改、查这四个基本操作: 1. **增加学生信息**:这涉及到在链表的末尾添加新节点。我们需要创建一个新节点,填充数据,然后将其`next`指针指向当前链表的末尾,最后更新链表的尾部指向新...

    C语言学生成绩链表.rar

    学生成绩管理系统,C语言链表方式实现,功能齐全

Global site tag (gtag.js) - Google Analytics