2021-08-24

C语言数据结构入门代码

1、头文件1
List.h
声明结构体和函数
注:“结构体类型”的声明和使用与函数的定义和使用有所不同,函数的定义可以放在调用处的后面,只需在前面声明一下即可。但是“结构体类型”的声明必须放在“使用结构体类型定义结构体变量”的前面。

如果程序规模比较大,往往会将结构体类型的声明集中放到一个以 .h 为后缀的头文件中。哪个源文件需要用到此结构体类型,只要用 #include 命令将该头文件包含到该文件中即可,这样做便于修改和使用

#pragma once
#include"stdbool.h"
typedef int Data;

//定义结构体
typedef struct _Node//节点类型,使得结构没那么复杂
{
	Data data;//数据域
	struct _Node* next;//指针域
}Node;

typedef struct _List
{
	Node* front;//指向头
	Node* tail;//指向尾
	int size;//大小
}List;
//创建链表
List *createList();

//尾部插入
void push_back(List* list,Data data);
//判断链表是否为空
bool empty(List *list);
//展示函数
void show(List* list);
//给用户提供一个接口
void transform(List *list,void(*fun)(Data*));

2、头文件2
stdbool.h

定义中使用到该头文件,但vs没有,摘抄自网络

#ifndef _STDBOOL
#define _STDBOOL
 
#define __bool_true_false_are_defined	1
 
#ifndef __cplusplus
 
#define bool	_Bool
#define false	0
#define true	1
 
#endif /* __cplusplus */
 
#endif /* _STDBOOL */
 

3、List.c

#include"List.h"
#include<malloc.h>
#include<stdio.h>


#include<string.h>
#include<stdlib.h>
//定义NULL;因为vs报错,显示未定义NULL
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
//创建一个链表
List* createList()
{
	List *list=(List*)malloc(sizeof(List));  //放在堆区,放在栈区就释放了
	//List相当于指针类型如int;char等,定义一个list指针,然后再给该指针赋给一个List类型的空间
	if(list==NULL) //判断是否为空
	{
		return NULL;
	}
	list->front=NULL; //头部为空
	list->tail=NULL;//尾部为空
	list->size=0;//长度为 0
	return list;
}

Node* createNode(Data data)
{
	Node *newNode=(Node*)malloc(sizeof(Node));  //newNodw   curNode  delNode nextNode
	if(newNode!=NULL)
	{
		newNode->next=NULL;
		newNode->data=data;
	}
	return newNode;
}

//插入函数
void push_back(List* list,Data data)
{
	Node *newNode=createNode(data);
	if(newNode==NULL)
		return;
	if(empty(list))
	{
		list->front=newNode;
		list->tail=newNode;
		list->size++;

	}
	else
	{
		list->tail->next=newNode;//让尾结点指向新节点
		list->tail=newNode;        //让为指针直向新节点
		list->size++;
	}

}

void show(List *list)
{
	if(empty(list))
		return;
	Node* curNode=list->front;//指向第一个数组
	while(curNode!=NULL)
	{
		printf("%d\t",curNode->data);

		curNode=curNode->next;//进行循环,一次指向下一个数组
	}
	
	system("pause");
	
}
//输出要遍历,查找要遍历,删除要遍历,给用户提供一个接口
void transform(List *list,void(*fun)(Data*))//函数的指针当做函数的参数,放在这里
{
//定义了一个遍历函数,省去每次复写代码的麻烦,需要遍历的时候直接调用该接口即可
	//做一个遍历
	Node* curNode=list->front;
	while(curNode!=NULL)
	{
		fun(&curNode->data);
		curNode=curNode->next;
	}
}
//清空指针
bool empty(List *list)
{
	return list->size == 0;
}

注:
malloc函数`

int *p;
 
p = (int *)malloc(sizeof(int));
 
.......
free(p);

1)malloc的返回是void *,如果我们写成了: p = malloc(sizeof(int)),间接的说明了(将void *转化给了int *,这不合理);
2) malloc的实参是sizeof(int),用于指明一个整形数据需要的大小,如果我们写成:p = (int *)malloc(1),那么可以看出:只是申请了一个字节的空间,如果向里面存放了一个整数的话,将会占用额外的3个字节,可能会改变原有内存空间中的数据;
3)malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我们习惯性的将其初始化为NULL。当然,也可以用memset函数的。
简单的说:malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。我们作为程序员,关注的 是逻辑上的连续,其它的,操作系统会帮着我们处理的。
4、主函数


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#include"List.h"
 #ifndef WIN32
#define WIN32
#endif

/*
1、链表:是一种数据结构,数据的一种组织形式
2、节点:一个一个的结构体
3、数据:节点里面存储的数据
4、指针域:指向下一个节点的指针
*/

//测试一下遍历函数
void print(Data* val)
{
   printf("%d",*val);
}

void add(Data* val)
{
	*val*=2;
}


int main()
{
	List *ls=createList();
      for(int i=0;i<5;i++)
	  {
		  //插入数据
		  push_back(ls,i);
	  }
	  
	  transform(ls,add);
	  transform(ls,print);
	  
	 // show(ls);
	 system("pause");
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值