什麼是數據結構 ?
答:1.數據結構是計算機存儲、組織組織的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率。數據結構往往同高效的檢索算法和索引技術有關。
結構分類
常用結構
數組 (Array)
棧 (Stack)
隊列 (Queue)
鏈表 (Linked List)
樹 (Tree)
圖 (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;
}