今天开始,我们就来学习数据结构了。
数据结构是计算机存储,组织数据的方式。
- //声明一个结构体类型
- struct MyTeacher //-种数据类型
- {
- char name[32];
- int id;
- int age;
- char addr[128];
- }
- int main
- {
- struct MyTeacher tech01; //数据元素
- struct MyTeacher tArray[30]; //数据对象
- memset(&t1, 0, sizeof(tech01));
- strcpy(tech01.name,"大明");
- strcpy(tech01.addr, "西安");
- tech01.id = 1001;
- tech01.age = 20;
- }
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构。根据数据元素之间关系的不同 特性,分为4中基本结构:
2. 插入数据
main.c
- #include
- #include
- #include
- #include "dynamic_arr.h"
- int main()
- {
- //初始化动态数组
- DYNAMIC_ARR *my_array=init_arr();
- //插入元素
- for(int i=0;i<30;i++)
- {
- insert_arr(my_array, i+100);
- }
- //打印容量
- printf("数组容量:%d\n",get_capacity_arr(my_array));
- printf("数组元素个数:%d\n",get_size_arr(my_array));
- //打印
- print_arr(my_array);
- //销毁
- free_arr(my_array);
- return 0;
- }
dynamic_arr.c
- #include
- #include
- #include
- #include "dynamic_arr.h"
- //初始化数组
- DYNAMIC_ARR *init_arr(void)
- {
- DYNAMIC_ARR *parr= (DYNAMIC_ARR *)malloc(sizeof(DYNAMIC_ARR));
- if(parr==NULL)
- {
- printf("malloc failed\n");
- return NULL;
- }
- parr->size=0;
- parr->capacity=20;
- parr->paddr=(int *)malloc(sizeof(int)*parr->capacity);
- if(parr->paddr==NULL)
- {
- printf("malloc failed\n");
- return NULL;
- }
- return parr;
- }
- //尾插法:插入元素
- void insert_arr(DYNAMIC_ARR *arr, int value)
- {
- if(arr == NULL)
- return;
- //判断空间是否足够
- if(arr->size == arr->capacity)
- {
- //1.申请更大空间,新空间是旧空间2倍
- int *new_space=malloc(sizeof(int)*arr->capacity*2);
- //2.拷贝数据到新空间
- memcpy(new_space,arr->paddr,arr->capacity*sizeof(int));
- //3.更新容量
- arr->capacity=arr->capacity*2;
- arr->paddr=new_space;
- }
- //插入新元素
- arr->paddr[arr->size]=value;
- arr->size++;
- }
- //依据位置删除元素
- int del_by_pos(DYNAMIC_ARR *arr, int pos)
- {
- if(arr == NULL)
- {
- return -1;
- }
- //判断位置是否有效
- if(pos<0 || pos >= arr->size)
- {
- return -1;
- }
- int i;
- int del_val;
- del_val = arr->paddr[pos];
- for(i=pos;i
size;i++) - {
- arr->paddr[i]=arr->paddr[i+1];
- }
- arr->size--;
- return del_val;
- }
- //依据数据查找出现的位置
- int find_by_value(DYNAMIC_ARR *arr, int value)
- {
- if(arr == NULL)
- {
- return -1;
- }
- //查找
- int i;
- int pos=-1;
- for(i=0;i
size;i++) - {
- if(arr->paddr[i]==value)
- {
- pos=i;
- break;
- }
- }
- return pos;
- }
- //依据值删除元素
- void del_by_value(DYNAMIC_ARR *arr, int value)
- {
- if(arr == NULL)
- {
- return;
- }
- //找到值的位置
- int i;
- int pos=find_by_value(arr,value);
- //根据位置删除
- del_by_pos(arr,pos);
- }
- //根据位置获得某个元素值
- int find_by_pos(DYNAMIC_ARR *arr, int pos)
- {
- if(arr == NULL)
- {
- return -1;
- }
- return arr->paddr[pos];
- }
- //打印
- void print_arr(DYNAMIC_ARR *arr)
- {
- if(arr == NULL)
- {
- return;
- }
- int i;
- for(i=0;i
size;i++) - {
- printf("%d ",arr->paddr[i]);
- }
- printf("\n");
- }
- //释放动态数组内存
- void free_arr(DYNAMIC_ARR *arr)
- {
- if(arr == NULL)
- {
- return;
- }
- if(arr->paddr != NULL)
- {
- free(arr->paddr);
- }
- free(arr);
- }
- //获取动态数组容量
- int get_capacity_arr(DYNAMIC_ARR *arr)
- {
- if(arr == NULL)
- {
- return -1;
- }
- return arr->capacity;
- }
- //获取动态数组当前存储元素个数
- int get_size_arr(DYNAMIC_ARR *arr)
- {
- if(arr == NULL)
- {
- return -1;
- }
- return arr->size;
- }
- #ifndef _DYNAMIC_ARR_H_
- #define _DYNAMIC_ARR_H_
- typedef struct DYNAMIC
- {
- int *paddr; //指向存储数据的指针
- int size; //数组已存储元素个数
- int capacity; //数组容量大小
- }DYNAMIC_ARR;
- //初始化数组
- DYNAMIC_ARR *init_arr(void);
- //插入元素
- void insert_arr(DYNAMIC_ARR *arr, int value);
- //依据位置删除元素
- int del_by_pos(DYNAMIC_ARR *arr, int pos);
- //依据值删除元素
- void del_by_value(DYNAMIC_ARR *arr, int value);
- //依据数据查找
- int find_by_value(DYNAMIC_ARR *arr, int value);
- //打印
- void print_arr(DYNAMIC_ARR *arr);
- //释放动态数组内存
- void free_arr(DYNAMIC_ARR *arr);
- //获取数组容量
- int get_capacity_arr(DYNAMIC_ARR *arr);
- //获取元素个数
- int get_size_arr(DYNAMIC_ARR *arr);
- #endif
- #include
- #include
- //定义一个data结构体
- typedef struct //一种数据类型
- {
- char name[32];
- int id;
- char addr[128];
- }Tech_info;
- //定义一个结点结构体
- typedef struct node
- {
- Tech_info data; //数据域
- struct node *next; //指针域
- }Node;
- int main()
- {
- //定义并初始化三个数据
- Tech_info p1={"刘德华",1002,"香港"};
- Tech_info p2={"郭德纲",1001,"天津"};
- Tech_info p3={"王宝强",1003,"河北"};
- //定义结点
- Node *node1=(Node *)malloc(sizeof(Node));
- if(node1==NULL)
- {
- printf("malloc failed\n");
- }
- Node *node2=(Node *)malloc(sizeof(Node));
- if(node2==NULL)
- {
- printf("malloc failed\n");
- }
- Node *node3=(Node *)malloc(sizeof(Node));
- if(node3==NULL)
- {
- printf("malloc failed\n");
- }
- //初始化结点数据域
- node1->data=p1;
- node2->data=p2;
- node3->data=p3;
- //初始化结点指针域,实现三个结点进行连接
- node1->next=node2;
- node2->next=node3;
- node3->next=NULL;
- printf("p3.name=%s\n",node1->next->next->data.name);
- printf("p3.name=%s\n",node3->data.name);
- return 0;
- }
●单链表
优点和缺点
删除结点
linklist.c:实现链表的创建、插入、删除、查找、获取链表长度、释放操作
- #include "linklist.h"
- //初始链表
- LinkList *init_linklist(void)
- {
- LinkList *list=(LinkList *)malloc(sizeof(LinkList));
- list->size=0;
- //头结点
- list->head=(LinkNode *)malloc(sizeof(LinkNode));
- list->head->data=NULL;
- list->head->next=NULL;
- return list;
- }
- //指定位置插入,z
- void insert_linklist(LinkList *list, int pos, void *data)
- {
- int count;
- if(list == NULL)
- {
- return ;
- }
- if(data == NULL)
- {
- return ;
- }
- if(pos<0 || pos >list->size)
- {
- pos=list->size;
- }
- //创建新的结点
- LinkNode *newnode=(LinkNode *)malloc(sizeof(LinkNode));
- newnode->data=data;
- newnode->next=NULL;
- //找结点
- //辅助指针变量
- LinkNode *pcurrent=list->head;
- int i;
- for(i=0;i
- {
- pcurrent=pcurrent->next;
- }
- #if 0
- while(pcurrent!=NULL&&pcurrent->next!=NULL)
- {
- pcurrent=pcurrent->next;
- count++;
- if(count=pos)
- {
- break;
- }
- }
- #endif
- //新结点插入链表
- newnode->next=pcurrent->next;
- pcurrent->next=newnode;
- list->size++;
- }
- //删除指定位置的值
- void del_by_pos_linklist(LinkList *list, int pos)
- {
- if(list == NULL)
- {
- return ;
- }
- if(pos<0 || pos >list->size)
- {
- return ;
- }
- //找结点
- //辅助指针变量
- LinkNode *pcurrent=list->head;
- int i;
- for(i=0;i
- {
- pcurrent=pcurrent->next;
- }
- //删除结点
- LinkNode *delnode=pcurrent->next;
- pcurrent->next=delnode->next;
- free(delnode);
- list->size--;
- }
- //获取链表长度
- int size_linklist(LinkList *list)
- {
- return list->size;
- }
- //查找
- int find_linklist(LinkList *list, void *data)
- {
- if(list == NULL)
- {
- return -1;
- }
- if(data == NULL)
- {
- return -2;
- }
- //遍历查找
- LinkNode *pcurrent = list->head->next;
- int i=1;
- while(pcurrent!=NULL)
- {
- if(pcurrent->data==data)
- {
- break;
- }
- i++;
- pcurrent=pcurrent->next;
- }
- return i;
- }
- //返回第一个结点
- void *first_linklist(LinkList *list)
- {
- return list->head->next->data;
- }
- //打印链表结点
- void print_linklist(LinkList *list, printlinknode print)
- {
- if(list == NULL)
- {
- return ;
- }
- //辅助指针变量
- LinkNode *pcurrent=list->head->next;
- while(pcurrent!=NULL)
- {
- print(pcurrent->data);
- pcurrent=pcurrent->next;
- }
- }
- //释放链表内存
- void free_linklist(LinkList *list)
- {
- if(list == NULL)
- {
- return ;
- }
- //辅助指针变量
- LinkNode *pcurrent=list->head;
- while(pcurrent!=NULL)
- {
- //缓存下一个结点
- LinkNode *pnext=pcurrent->next;
- free(pcurrent);
- pcurrent=pnext;
- }
- //释放链表内存
- list->size=0;
- free(list);
- }
linklist.h
:用于声明
linklist.c
的所有函数声明
- #ifndef LINKLIST_H
- #define LINKLIST_H
- #include
- #include
- #include
- //链表节点
- typedef struct NODE
- {
- void *data;
- struct NODE *next;
- }LinkNode;
- //链表结构体
- typedef struct
- {
- LinkNode *head;
- int size;
- }LinkList;
- //打印函数指针
- typedef void (*printlinknode)(void *);
- //初始链表
- LinkList *init_linklist(void);
- //指定位置插入
- void insert_linklist(LinkList *list, int pos, void *data);
- //删除指定位置的值
- void del_by_pos_linklist(LinkList *list, int pos);
- //获取链表长度
- int size_linklist(LinkList *list);
- //依据数据查找所在位置
- int find_linklist(LinkList *list, void *data);
- //返回第一个结点
- void *first_linklist(LinkList *list);
- //打印链表结点
- void print_linklist(LinkList *list, printlinknode print);
- //释放链表内存
- void free_linklist(LinkList *list);
- #endif
main.c
:进行测试链表的所有操作。
- #include "linklist.h"
- typedef struct
- {
- char name[64];
- int age;
- int score;
- }Person;
- //打印函数
- void my_print(void *data)
- {
- Person *p=(Person *)data;
- printf("name:%s age:%d score:%d\n",p->name,p->age,p->score);
- }
- int main()
- {
- //创建链表
- LinkList *list=init_linklist();
- //获取链表长度
- printf("list 长度:%d\n",size_linklist(list));
- //创建数据
- Person p1={"大明",18,96};
- Person p2={"小明",19,97};
- Person p3={"老明",20,98};
- //数据插入链表
- insert_linklist(list, 0, &p1);//0表示头插法
- insert_linklist(list, 0, &p2);
- //打印
- print_linklist(list, my_print);
- printf("\n");
- //指定位置1处,插入
- insert_linklist(list, 1, &p3);
- //打印
- print_linklist(list, my_print);
- printf("\n");
- //依据数据找所在位置
- int ret=find_linklist(list, &p3);
- printf("\"老明\"所在位置:%d\n",ret);
- //指定位置1处,删除
- del_by_pos_linklist(list, 1);
- //打印
- print_linklist(list, my_print);
- printf("\n");
- //获取链表长度
- printf("list 长度:%d\n",size_linklist(list));
- //返回第一个结点
- Person *p=(Person *)first_linklist(list);
- printf("第一个结点:name-%s,age-%d,score-%d\n",p->name,p->age,p->score);
- //销毁
- free_linklist(list);
- return 0;
- }
今天就学到这里,明天我们继续哦!