#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;
}
}
分享到:
相关推荐
VS2008运行环境 c语言实现单链表增删改查操作 并输出到控制台上
C语言编写的单链表增删改查,实现了单链表的增加,删除,修改,查询等功能
C语言简单的单链表增删改查。
链表是一种常见的数据结构,资源包含了我对单链表的增删改查实现,本资源是不带头结点的单链表的增删改查,个人能力有限,希望指出不足之处,与大家共勉
链表是由一连串节点组成的数据结构,每个节点包含一个数据值和一个指向下一个节点的指针。链表可以在头部和尾部插入和删除节点,因此可以在任何地方插入和删除节点,从而使其变得灵活和易于实现。...
大三上学期数据结构第一次实验,内容: 1)数据文件为cet4word.txt,其中每行描述了一个词条,包含英文单词、词性及中文释义等属性 2)将每个词条定义为一个结构体 3)能够实现词典的装载、添加、删除、按英文单词...
本库为C语言(Linux环境下编写的适用于所有C的数据结构库函数)。包括了最基础也是最常用的增删改查功能函数,队列,栈,链表(单链表,双链表,循环链表等都有),树的增删改查函数。程序可靠。
在Linux环境下,用C语言单链表实现简单的学生信息管理,实现了基础的增、删、改、查功能。
1、实现软件:Dev-C++ 2、详细的测试页面可见我《资源》专栏下的《C语言系统资源测试》。 3、适合新手下载学习。...8、功能:增删改查(多途径删改查)、浏览、统计(统计超过平均工资的员工信息)
这是一个单链表的c语言实现程序,实现对表的增、删、改、查,排序等操作。
这是用C语言写的单链表操作的小程序,包括单链表的增、删、改、查等操作,有兴趣的朋友可以下载下来看下
1、实现软件:Dev-C++ 2、详细的测试页面可见我《资源》专栏下的《C语言系统资源测试》。 3、适合新手下载学习。 4、基于C语言的单链表实现。(没有带头节点) ...6、功能:增删改查排序浏览、指定位置插入
通讯录:用单链表存储的c语言控制台程序,基于visual编程,有增删改查,排序,文件保存等功能
c语言 C语言课程设计:学生管理系统 介绍 控制台应用 C语言课设大作业 对学生的增删改查 包含登录注册功能 以本地csv文件作为数据源,支持将修改保存到本地 以单链表保存学生
是一个用c语言实现单链表的增删改查的一个综合性demo,用于理解单链表的创建过程和数据结构的定义,以及如何使用快慢指针实现高效率的查找工作。
双向链表(Doubly Linked List)是一种常见的数据结构,在单链表的基础上增加了向前遍历的功能。与单向链表不同,双向链表的每个节点除了包含指向下一个节点的指针外,还包含指向前一个节点的指针。
学生成绩管理系统,C语言链表方式实现,功能齐全
电话号码管理项目是一个简单的软件,可以用于存储和管理用户的电话号码、姓名和其他相关信息。该项目通常会涉及一些常见的...在代码实现中,可以使用C语言来实现链表数据结构,并编写对应的函数来实现操作链表的功能。
运用数据结构的单链表实现对学生成绩的增删改查,录入学生成绩时运用到了C语言文件的操作,本程序介绍了两种链表组织方式头插法和尾查法。
球场预约信息管理 基本功能: 球场(篮球,羽毛球,乒乓球)安排信息, 实现修改、删除、显示和查询功能, 统计功能: 某球场月/年统计使用时间, 某人月/年统计使用时间 预约数据内容:日期, 起始时间、终止时间,...