什么是数据结构 ?
答:1.数据结构是计算机存储、组织组织的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
结构分类
常用结构
关于数据结构的简单例子
/*
============================================================================
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;
}
数据结构的基本概念 单链表的应用,布布扣,bubuko.com
原文:http://blog.csdn.net/gujianpenggu/article/details/20566217