数据结构的基本概念 单链表的应用
来源:互联网 发布:斩首大刀淘宝 编辑:程序博客网 时间:2024/06/14 22:18
什么是数据结构 ?
答:1.数据结构是计算机存储、组织组织的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
结构分类
常用结构
数组 (Array)
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。栈 (Stack)
是只能在某一端插入和删除的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。队列 (Queue)
一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是按照“先进先出”或“后进后出”的原则组织数据的。队列中没有元素时,称为空队列。链表 (Linked List)
是一种物理存储单元上非连续、非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。树 (Tree)
是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:(1)有且仅有一个结点 K0,他对于关系N来说没有前驱,称K0为树的根结点。简称为根(root)。 (2)除K0外,K中的每个结点,对于关系N来说有且仅有一个前驱。(3)K中各结点,对关系N来说可以有m个后继(m>=0)。
图 (Graph)
堆 (Heap)
散列表 (Hash)
关于数据结构的简单例子
/*
============================================================================
Name : D_LinkList.c
Author : 谷建鹏
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
typedef int DataType; //将int类型重新定义一个新的类型DataType
typedef struct LNode{ //定义结构体,实际上就是结点
DataType data;//定义数据域
struct LNode *next; //定义指针域
}LinkList;
//再定义一个结点
typedef LinkList Node;
/*
* 功能:创建并且初始化
* 参数:整数,用于创建第一个结点
* 返回值:返回头指针
* 思路:
* 1)先要创建头指针
* (1)头指针的数据域 存放当前线性表的长度
* (2)指针域指向空
* 2)创建第一个结点
* (1)数据域 存 函数传递过来的参数
* (2)指针域指向空
* (3)修改头指针的指向为新创建的指针
* 3)返回头指针
*/
LinkList * Create_LinkList(DataType data){ //创建头指针
LinkList *head = (LinkList *)malloc(sizeof(LinkList));
if(head!=NULL){
Node *p = (Node*)malloc(sizeof(Node)); //创建第一个结点
if(p!=NULL){
p->data = data;
p->next = NULL;//设定数据域和指针域
head->next = p;//设定头指针的指针域
head->data = 1;//设定头指针的数据域
}else{
printf("第一个结点创建失败!\n");
}
//返回头结点的指针
return head;
}else{
printf("头结点创建失败!\n");
return NULL;
}
}
/*
* 功能:打印线性链表
* 参数:LinkList *head (线性链表的头指针)
* 返回值:void
* 思路:
* 1)定义一个指针变量,获取第一个元素(p = head->next)
* 2)循环遍历,条件是:p->next!=NULL
* 3)打印p指向的数据域 :p->data
*/
void Print_LinkList(LinkList *head){
//定义一个指针变量,让其指向线性链表的第一个元素
Node *p = head->next; //head->next肯定是第一个元素
while(p!=NULL){
printf("%d\t",p->data);
p=p->next; //让p向下移动
}
printf("\n");
}
/*
* 功能:线性单链表的添加新的元素
* 参数:LinkList *head,DataType data
* 返回值:void
* 思路:
* 插入一个元素到我们的线性链表中,有两种方法:
* 头插法
* 每次在头结点之后插入一个元素
* 尾插法(作业)
* 每次在最后一个元素之后插入新的元素
*
* 使用头插法,实现新元素的插入的步骤:
* 1)先给新元素申请内存空间
* 2)设置新元素的数据域和指针域
* 3)设置头指针数据域和指针域
*
*/
void Insert_LinkList(LinkList *head,DataType data){
//申请新的空间
Node *new = (Node*)malloc(sizeof(Node));
if(new!=NULL){
new->data = data;//设定新的元素的数据域和指针域
new->next = head->next;
head->next = new;//让head执行新添加的数据
head->data++;
}else{
printf("插入数据,空间申请失败!\n");
}
}
/* 功能:删除结点
* 参数:LinkList *head,DataType data
* 返回值:int (返回删除数据所在的位置)
* 思路:
* 1、根据头指针的指向,找到第一个元素,并且定义一个新的指针指向它
* 2、判断要删除的是否是第一个结点
* 3、如果不是第一个结点
*/
int Delete_LinkList(LinkList *head,DataType data){
Node *p = head->next; //p指向了第一个结点
//进行删除的时候临时存储结点的信息
Node *temp;
int loc=0;
while(p!=NULL){
loc++;
//判断要删除的是不是当前元素
if(p->data == data){
//把第二个元素的信息存储到temp中
temp = p->next;
free(p);
head->next = temp;
head->data --;
break;
}else if(p->next->data == data){
//判断是不是下一个元素
temp = p->next;
p->next = p->next->next;
free(temp);
head->data --;
loc++;
break;
}else{
//指针下移
p = p->next;
}
}
return loc;
}
/* 功能:按值查找
* 参数:LinkList *head,DataType data
* 返回值:int 位置
* 思路:
* 1)定义一个指针变量,让其指向第一个元素
* 2)判断指针指向的值,是否等于要查找的值
* 3)如果等于,则返回位置,如果不等于则指针下移 p = p->next;
*/
int SearchByData_LinkList(LinkList *head,DataType data){
Node *p = head->next;
int loc=0;
while(p!=NULL){
loc++;
//判断当前指针指向的值是否是要查找的值,如果是,则停止
if(p->data == data){
break;
}else{
//如果不是,则指针下移
p = p->next;
}
}
return loc;
}
/* 功能:按值查找
* 参数:LinkList *head,DataType oldData,DataType newData
* 返回值:void
* 思路:
* 1)定义一个指针变量,让其指向第一个元素
* 2)判断指针指向的值,是否等于要查找的值
* 3)如果等于,则修改原来的值=新的值(p->data=newData),如果不等于则指针下移 p = p->next;
*/
void ModifyByData_LinkList(LinkList *head,DataType oldData,DataType newData){
Node *p = head->next;
while(p!=NULL){
//判断当前指针指向的值是否是要查找的值,如果是,则停止
if(p->data == oldData){
//修改当前指针的值为要修改的值
p->data = newData;
break;
}else{
//如果不是,则指针下移
p = p->next;
}
}
}
int main(void) {
//定义线性链表,并且初始化
LinkList *llist = Create_LinkList(7);
//打印线性表的内容
Print_LinkList(llist);
//插入数据
Insert_LinkList(llist,58);
Print_LinkList(llist);
Insert_LinkList(llist,90);
Insert_LinkList(llist,88);
Insert_LinkList(llist,60);
Print_LinkList(llist);
Delete_LinkList(llist,60);
Print_LinkList(llist);
printf("删除的位置是:%d\n",Delete_LinkList(llist,7));
Print_LinkList(llist);
printf("线性链表的长度:%d\n",llist->data);
printf("58的位置是:%d\n",SearchByData_LinkList(llist,58));
ModifyByData_LinkList(llist,58,588);
Print_LinkList(llist);
return EXIT_SUCCESS;
}
- 数据结构的基本概念 单链表的应用
- [数据结构]数据结构的基本概念
- 【数据结构】:数据结构的基本概念
- 【Data】数据结构的基本概念
- 数据结构的基本概念
- 数据结构的基本概念
- 数据结构的基本概念
- 数据结构的基本概念
- 数据结构的基本概念
- 数据结构的基本概念
- 数据结构的一些基本概念
- 数据结构的基本概念
- 数据结构的基本概念?
- 数据结构-图的基本概念
- 数据结构的基本概念
- 数据结构-图的基本概念
- 数据结构的一些基本概念
- 数据结构--树的基本概念
- 数据库范式详解
- Deep learning笔记
- java web 技术之Servlet
- 仅从性能上分析 java到底和C /C++ 差在了那里
- javascript文件夹选择框的两种解决方案
- 数据结构的基本概念 单链表的应用
- [linux]进程(六)——守护进程
- Codeforces 398B Painting The Wall(dp)
- JTextArea动态更新
- C# FileStream.Read Method
- Max Points on a Line
- How to write fast multi-thread Delphi applications
- Dev c++运行出现以下错误的解决方法
- Struts2(四)——页面相关内容