数据结构-C语言

以下代码是博主学习期间的代码,有什么疑问或者补充请在下面评论区留言😄😄😄

1.顺序表

//2022.9.1 顺序表
#include<stdio.h>
#include<stdlib.h>

#define N 20
typedef struct sqlist
{
	int *elem;         //基地址
	int length;        //线性表长度
	int listsize;      //存储空间的大小
}sql;

//定义一个变量(顺序表)

sql L;
//初始化
void InitList()
{
	L.elem=(int *)malloc(N*sizeof(int));  //获取整型需要的存储空间
	if(!L.elem)
		exit(0);						  //空间申请失败,退出
	L.listsize=N;                         //空间大小
	L.length=0;							  //空间长度
}
//输入
void input(int n)
{
	int i;
	printf("输入数组的值:");
	for(i=0;i<n;i++)
		scanf("%d",&L.elem[i]);
	L.length=n;
}
//输出
void output()
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d ",L.elem[i]);
	printf("\n");
}
//插入
void insertNode(int i,int e)  //插入节点
{
	int *p,*q,k=i;
	q=L.elem+i-1;
	if(k<0||k>L.length+1)
		{
			printf("超出范围无法插入\n");
			exit(0);
	}
	if(L.length>=L.listsize)
	{
		printf("存储空间不足!!!\n");
		exit(0);
		/*
	newbase=(int *)realloc(L.elem,(N+M)*sizeof(int))   //追加存储空间
	if(!newbase)
		exit(0);
	L.elem=newbase:
	L.listsize+=M;*/
	}

	for (p = L.elem+L.length-1; p >=q ; p--)
		*(p+1)=*p;			//移动元素
	*q=e;					
	L.length++;

}
//删除
int delNode(int i)
{
	int *p,*q;
	int e;
	q=L.elem+i-1;
	e=*q;
	for(p=q+1;p<=L.elem+L.length-1;p++)
		*(p-1)=*p;
	L.length--;
	return e;
}
void main()
{
	int n,i=3,e=7;
	InitList();
	printf("输入n的值:");
	scanf("%d",&n);
	input(n);
	printf("插入前的值:");
	output();
	insertNode(3,7);
	printf("插入后的值:");
	output();
	delNode(4);
	printf("删除后的值:");
	output();

}

2.单链表-正序

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	int data;
	struct node *next;
}node;

node *l,*t;

void initlist(){
	l=(node *)malloc(sizeof (node));
	if (!l)
		exit(0);
	l->next=NULL;
	t=l;

}
void creat(int n){
	node *p;
	int i;
	for (i=1;i<=n;i++)
	{
		p=(node *)malloc(sizeof (node));
		if (!p)
			exit(0);
		scanf("%d",&p->data);
		p->next=NULL;
		t->next=p;
		t=p;	
	}
	
}
void output(){
	node *p;
	p=l->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf ("\n");
}

void main(){
	int n;
	initlist();
	printf("请输入链表长度:");
	scanf("%d",&n);
	printf("请输入元素:");
	creat(n);
	printf("输出结果:\n");
	output();
}

3.单链表

//2022.9.13链式表
#include <stdio.h>
#include <stdlib.h>


typedef struct link
{
	int data;//代表数据域
	struct link *next;//代表指针域,指向后继元素
}link;//link为节点名,每个节点都是一个link结构体

//定义头指针
link *L;
//初始化链表
void Initlink(){
	L=(link*)malloc(sizeof(link));//创建首元节点
	L->next=NULL;//创建头指针
}
//创建单链表
void creatlink(int n){
	link *p;
	Initlink();
	int i;
	for(i=1;i<=n;i++){
		p=(link*)malloc(sizeof(link));
		scanf("%d",&p->data);
		p->next=L->next;
		L->next=p;
	}
}
//遍历(输出访问)
void output(){
	link *p;
	p=L->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}
//插入
void insertlink(int i,int e){
	link *p,*s;
	p=L;
	int j=0;
	while(j<i-1&&p)
	{
		p=p->next;
		j++;
	}
	if(j>i-1||!p)		//是否合法
	{
		printf("插入位置不存在:\n");
		exit(0);
	}
	s=(link *)malloc(sizeof(link)); 	//在插入地方分配内存
	s->data=e;
	s->next=p->next;
	p->next=s;
}
//删除
int dellink(int i){
	link *p,*q;
	int j,e;
	p=L;
	j=0;
	while(j<i-1&&p->next){
		p=p->next;
		j++;
	}
	if(j>i-1||!p->next)		//是否合法
	{
		printf("插入位置不存在:\n");
		exit(0);
	}
	q=p->next;
	e=q->data;
	p->next=q->next;
	free(q);      //释放已分配的内存
	return e;
}
void main(){
	int i,e,n,x;
	Initlink();
	printf("请输入像创建的元素个数:");
	scanf("%d",&n);
	printf("请输入元素:");
	creatlink(n);
	printf("输出结果为:");
	output();
	printf("\n输入插入位置:");
	scanf("%d",&i);
	printf("输入插入的值:");
	scanf("%d",&e);
	insertlink(i,e);
	printf("输出插入后的结果:");
	output();
	printf("\n请输入删除的值位置:");
	scanf("%d",&x);
	printf("返回删除的值:");
	printf("%d",dellink(x));
}

4.单链表-多个

//2022.9.28 建立多个正序单链表并合并 
#include<stdio.h>
#include<stdlib.h>

typedef struct node {
	int data;
	struct node* next;
}node;



node* initlist() {
	node* l, * t;
	l = (node*)malloc(sizeof(node));
	if (!l)
		exit(0);
	l->next = NULL;
	t = l;
	return l;//返回头指针
}
//创建链表
void creat(node* l, int n) {
	node* p, * t;
	t = l;
	int i;
	for (i = 1; i <= n; i++)
	{
		p = (node*)malloc(sizeof(node));
		if (!p)
			exit(0);
		scanf("%d", &p->data);
		p->next = NULL;
		t->next = p;
		t = p;
	}
}
//历遍(输出)
void output(node* l) {
	node* p;
	p = l->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
//合并链表
node* merge(node* l1, node* l2) {
	node* p, * i, * j, * t;
	i = l1->next;
	j = l2->next;
	//比较两个链表第一个节点的大小
	if(i->data<=j->data){
		t = l1;
	}
	else {
		t = l2;
	}
	//将头节点给临时变量p
	p = t;
	while (i && j) {
		if (i->data < j->data)//判断那一个作为第一个节点
		{
			p->next = i;
			p = i;
			i = i->next;
		}
		else {
			p->next = j;
			p = j;
			j = j->next;
		}
		//如果其中一个链表较长将剩余的加在后面
		if (i) {
			p->next = i;
		}
		else if(j)
		{
			p->next = j;
		}
	}
	return t;
}
void main() {
	int n, m;
	node* l1, * l2, * l;
	l1 = initlist();
	l2 = initlist();
	printf("请输入l1链表的长度:");
	scanf("%d", &n);
	printf("请输入了l1中的元素:");
	creat(l1, n);
	printf("输出l1的结果:\n");
	output(l1);
	printf("请输入l2链表的长度:");
	scanf("%d", &m);
	printf("请输入了l2中的元素:");
	creat(l2, m);
	printf("输出l2的结果:\n");
	output(l2);
	l = merge(l1, l2);
	printf("输出合并链表l的值:\n");
	output(l);
}

5.邻接表

#include <stdio.h>
#include <stdlib.h>
#define N 20
typedef struct link
{
	int data;//代表数据域
	struct link *next;//代表指针域,指向后继元素
}link;//link为节点名,每个节点都是一个link结构体

link *b[N];//头节点
//创建
void creat(int n){
	int u,v;
	link *p;
	for(u=0;u<n;u++)
		b[u]=NULL;
	scanf("%d%d",&u,&v);
	while(u>=0)
	{
		p=(link*)malloc(sizeof(link));
		p->data=v;
		p->next=b[u];
		b[u]=p;
		scanf("%d%d",&u,&v);
	}
}
//遍历
void output(int n){
	link *p;
	int u;
	for(u=0;u<n;u++)
	 {
		printf("%5d",u);
		p=b[u];
		while(p)
		{
			printf("%5d",p->data);
			p=p->next;
		}
		printf("\n");
	}
}

void main(){
	creat(6);
	printf("邻接表为:\n");
	output(6);
}

6.双向链表

//2022.9.16双向链表
#include<stdio.h>
#include<stdlib.h>


typedef struct dlink{
	int data;//代表数据域
	struct dlink *prior,*next;//prior代表前驱,next代表后继
}dlink;//双链表节点名

dlink *L;
//初始化链表
void initlink()
{
	L=(dlink *)malloc(sizeof(dlink));
	L->next=NULL;
	L->prior=NULL;
}
//创建双向链表
void creatlink(int n){
	dlink *p;
	initlink();
	int i;
	for(i=1;i<=n;i++){
		p=(dlink*)malloc(sizeof(dlink));
		scanf("%d",&p->data);
		p->next=L->next;
		L->next=p;
		p->prior=L;
		L->next->prior=p;
	}
}
//遍历(输出访问)
void output(){
	dlink *p;
	p=L->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
}
//插入
void insertlink(int i,int e){
	dlink *p,*s;
	p=L;
	int j=0;
	while(j<i-1&&p){
		p=p->next;
		j++;
	}
	if(j>i-1||!p)
	{
		printf("插入位置不存在:\n");
		exit(0);
	}
	s=(dlink *)malloc(sizeof(dlink));
	s->data=e;
	s->next=p->next;
	s->prior=p;
	p->next=s;
	p->next->prior=s;
}
//删除
int dellink(int i){
	dlink *p,*q;
	int j,e;
	p=L;
	j=0;
	while(j<i-1&&p->next){
		p=p->next;
		j++;
	}
	if(j>i-1||!p->next)		//是否合法
	{
		printf("插入位置不存在:\n");
		exit(0);
	}
	q=p->next;
	e=q->data;
	p->next=q->next;
	q->next->prior=p;
	free(q);      //释放已分配的内存
	return e;
}
void main(){
	int n,i,e,x;
	initlink();
	printf("请输入像创建的元素个数:");
	scanf("%d",&n);
	printf("请输入元素:");
	creatlink(n);
	printf("输出结果为:");
	output();
	printf("\n输入插入位置:");
	scanf("%d",&i);
	printf("输入插入的值:");
	scanf("%d",&e);
	insertlink(i,e);
	printf("输出插入后的链表:");
	output();
	printf("\n请输入删除的值位置:");
	scanf("%d",&x);
	printf("返回删除的值:");
	printf("%d",dellink(x));
	printf("\n返回删除后的链表:");
	output();
}

7.栈

//2020.9.23栈
#include <stdio.h>
#include <stdlib.h>


#define N 20

//定义顺序栈的类型
typedef struct sqstack{
	int *base;  //栈底指针
	int *top;  //栈顶指针
	int stacksize; //存储空间大小
}sqs;

sqs s; 	//定义一个顺序栈

//初始化
void initstack(){
	s.base=(int *)malloc(N*sizeof(int));
	if(!s.base)
		exit(0);
	s.top=s.base;  	//空栈
	s.stacksize=N;
}

//入栈(插入元素)
void push(int e){
	if(s.top-s.base>=s.stacksize){
		printf("栈满\n");
		exit(0);
		/*s.base=(int *)realloc(s.base,(N+M)*sizeof(int))
		if(!s.base) exit(0);
		s.top=s.base+s.stacksize;
		s.stacksize+=M;
		*/
	}
	*s.top=e;	//插入
	s.top++;	//修改栈顶指针
}

//出栈(删除)
int pop(){
	int e;
	if(s.top==s.base){
		printf("空栈\n");
		exit(0);
	}
	s.top--;//修改栈顶指针
	e=*s.top;//赋值
	return e;
}

//数值转换
void conversion(){
	int n,x;
	initstack();
	printf("请输入十进制数:");
	scanf("%d",&n);
	while(n)
	{
		x=n%2;
		push(x);
		n=n/2;
	}
	printf("转换为二进制数:");
	while(s.top!=s.base)
		printf("%d",pop());
	printf("\n");
}

void main(){
	int e,n;
	initstack();
	printf("请输入入栈元素个数:");
	scanf("%d",&n);
	printf("请输入入栈元素:");
	for(int i=1;i<=n;i++){
		scanf("%d",&e);
		push(e);
	}
	printf("返回删除的值:");
	while(s.top!=s.base)
		printf("%d ",pop());
	printf("\n");
	conversion();
}

8.队列

//2022.9.27 队列
//队列的特点,插入在队尾,删除在队前,先进先出.

#include <stdio.h>
#include <stdlib.h>

//定义单链表节点类型
typedef struct qlink{
	int data;  //数据域
	struct qlink *next;//指针域
}qlink;


//定义链队列的类型
typedef struct linkqueue{
	qlink *front;//队头指针
	qlink *rear;//队尾指针
}linkq;

linkq q;//定义一个链队列

//初始化链队列
void initqlink(){
	q.front=(qlink *)malloc(sizeof(qlink));
	if (!q.front)
		exit(0);
	q.front->next=NULL;
	q.rear=q.front;//空队列
}

//入队(插入)
void enqlink(int e){
	qlink *p;
	p=(qlink *)malloc(sizeof(qlink));
	if (!p)
		exit(0);
	p->data=e;
	p->next=NULL;
	q.rear->next=p;//连接作用
	q.rear=p;//修改队尾指针
}

//出队(删除)
int deqlink(){
	qlink *p;
	int x;
	if(q.rear==q.front){
		printf("空队列,不进行删除\n");
		exit(0);
	}
	p=q.front->next;
	x=p->data;
	q.front->next=p->next;
	if(p==q.rear)//如果队尾指针没有,空队列
		q.rear=q.front;
	free(p);
	return x;

}
void main(){
	int e,n;
	initqlink();
	printf("请输入创建的队列的长度:\n");
	scanf("%d",&n);
	printf("请输入元素:\n");
	for(int i=1;i<=n;i++){
	scanf("%d",&e);
	enqlink(e);
}
	printf("返回删除的值:");
	while(q.rear!=q.front){
	printf("%d ",deqlink());
	}
}

9.回文-数值

//2022.9.28 回文的实现(数值)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//定义单链表节点类型
typedef struct qlink {
	int data;  //数据域
	struct qlink* next;//指针域
}qlink;


//定义链队列的类型
typedef struct linkqueue {
	qlink* front;//队头指针
	qlink* rear;//队尾指针
}linkq;

linkq q;//定义一个链队列

//初始化链队列
void initqlink() {
	q.front = (qlink*)malloc(sizeof(qlink));
	if (!q.front)
		exit(0);
	q.front->next = NULL;
	q.rear = q.front;//空队列
}

//入队(插入)
void enqlink(int e) {
	qlink* p;
	p = (qlink*)malloc(sizeof(qlink));
	if (!p)
		exit(0);
	p->data = e;
	p->next = NULL;
	q.rear->next = p;//连接作用
	q.rear = p;//修改队尾指针
}

//出队(删除)
int deqlink() {
	qlink* p;
	int x;
	if (q.rear == q.front) {
		printf("空队列,不进行删除\n");
		exit(0);
	}
	p = q.front->next;
	x = p->data;
	q.front->next = p->next;
	if (p == q.rear)//如果队尾指针没有,空队列
		q.rear = q.front;
	free(p);
	return x;

}
#define N 20

//定义顺序栈的类型
typedef struct sqstack {
	int* base;  //栈底指针
	int* top;  //栈顶指针
	int stacksize; //存储空间大小
}sqs;

sqs s; 	//定义一个顺序栈

//初始化
void initstack() {
	s.base = (int*)malloc(N * sizeof(int));
	if (!s.base)
		exit(0);
	s.top = s.base;  	//空栈
	s.stacksize = N;
}

//入栈(插入元素)
void push(int e) {
	if (s.top - s.base >= s.stacksize) {
		printf("栈满\n");
		exit(0);
		/*s.base=(int *)realloc(s.base,(N+M)*sizeof(int))
		if(!s.base) exit(0);
		s.top=s.base+s.stacksize;
		s.stacksize+=M;
		*/
	}
	*s.top = e;	//插入
	s.top++;	//修改栈顶指针
}

//出栈(删除)
int pop() {
	int e;
	if (s.top == s.base) {
		printf("空栈\n");
		exit(0);
	}
	s.top--;//修改栈顶指针
	e = *s.top;//赋值
	return e;
}
//判断是否为回文
void judge() {
	int e, n, x = 0, y = 0;
	initstack();
	initqlink();
	printf("请输入数值长度:");
	scanf("%d", &n);
	printf("请输入数值:");//逐个输入元素
	for (int i = 1; i <= n; i++) {
		scanf("%d", &e);
		push(e);
		enqlink(e);
	}
	int b = n;//第一个循环n--到0了,需要将n赋给另一个变量
	while (s.top != s.base)
	{
		

		x = x + pop() * pow(10,n);
		n--;
	}
	printf("输出x的值");
	printf("%d", x/10);//将各个元素合在一起化成数值
	printf("\n");
	while (q.rear != q.front)
	{
		
		y = y + deqlink() * pow(10, b );
		b--;
	
	}
	printf("输出y的值");
	printf("%d", y/10);//将各个元素合在一起化成数值
	printf("\n");
	if (x == y)//比较是否相等判断是否为回文
		printf("该数值是回文");
	else
		printf("该数值不是回文");

}
/*这里面有个问题,就是pow()里面的n如果等于n-1的话出来的结果不正确,不知道为什么,
在vs studio里面是正常的,但只要把他变成n,在输出的时候再除上一个10就行了*/
void main() {
	judge();
}

10.回文-字符

//2022.9.28 回文的实现(字符)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//定义单链表节点类型
typedef struct qlink {
	int data;  //数据域
	struct qlink* next;//指针域
}qlink;


//定义链队列的类型
typedef struct linkqueue {
	qlink* front;//队头指针
	qlink* rear;//队尾指针
}linkq;

linkq q;//定义一个链队列

//初始化链队列
void initqlink() {
	q.front = (qlink*)malloc(sizeof(qlink));
	if (!q.front)
		exit(0);
	q.front->next = NULL;
	q.rear = q.front;//空队列
}

//入队(插入)
void enqlink(char e) {
	qlink* p;
	p = (qlink*)malloc(sizeof(qlink));
	if (!p)
		exit(0);
	p->data = e;
	p->next = NULL;
	q.rear->next = p;//连接作用
	q.rear = p;//修改队尾指针
}

//出队(删除)
char deqlink() {
	qlink* p;
	char x;
	if (q.rear == q.front) {
		printf("空队列,不进行删除\n");
		exit(0);
	}
	p = q.front->next;
	x = p->data;
	q.front->next = p->next;
	if (p == q.rear)//如果队尾指针没有,空队列
		q.rear = q.front;
	free(p);
	return x;

}
#define N 20

//定义顺序栈的类型
typedef struct sqstack {
	int* base;  //栈底指针
	int* top;  //栈顶指针
	int stacksize; //存储空间大小
}sqs;

sqs s; 	//定义一个顺序栈

//初始化
void initstack() {
	s.base = (int*)malloc(N * sizeof(int));
	if (!s.base)
		exit(0);
	s.top = s.base;  	//空栈
	s.stacksize = N;
}

//入栈(插入元素)
void push(char e) {
	if (s.top - s.base >= s.stacksize) {
		printf("栈满\n");
		exit(0);
		/*s.base=(int *)realloc(s.base,(N+M)*sizeof(int))
		if(!s.base) exit(0);
		s.top=s.base+s.stacksize;
		s.stacksize+=M;
		*/
	}
	*s.top = e;	//插入
	s.top++;	//修改栈顶指针
}

//出栈(删除)
char pop() {
	char e;
	if (s.top == s.base) {
		printf("空栈\n");
		exit(0);
	}
	s.top--;//修改栈顶指针
	e = *s.top;//赋值
	return e;
}
//判断是否为回文
void judge() {
	char e;
	int n;
	initstack();
	initqlink();
	printf("请输入第一个字符串长度和元素:");//直接输入不要有空格
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		e = getchar();
		push(e);
		enqlink(e);
	}
	printf("是否为回文:");
	while (s.top != s.base&& q.rear != q.front)//判断是否为回文,因为长度都相同所以要存在都存在,要不存在都不存在
	{
		if (pop() != deqlink())
			printf("NO");
		else
		{
			printf("YES");
			break;
		}
	}
	
}
void main() {
	judge();
}

11.循环队列

//2022.9.30循环队列
#include <stdio.h>
#include <stdlib.h>


#define N 20

//定义顺序队列的类型
typedef struct sqque
{
	int *base;//基地址
	int front;//队头指针(下标)
	int rear;//队尾指针(下表)
}sqq;

//定义一个顺序队列
sqq q;

void initque(){
	q.base=(int *)malloc(N*sizeof(int));
	if(!q.base)
		exit();
	q.front=q.rear=0;//空队列
}
//入队
void enque(int e)
{
	if(q.front==(q.rear+1)%N)
	{

		exit(0);
	}
	q.base[q.rear]=e;//元素的插入
	q.rear=(q.rear+1)%N;//修改的队尾指针

}
//出队
void delque(){
	int e;
	if(q.base==q.rear)
	{

		exit(0);
	}
	e=q.rear[q.front];
	q.front=(q.front+1)%N;//修改队头指针
	return e;

}

12.三元组顺序表

//2022.10.11
#include <stdio.h>
#include <stdlib.h>

#define N 20
//定义三元组类型
typedef struct triple
{
	int i,j;//行列下标
	int e;//非零元的值
}triple;

//定义三元组顺序表的类型
typedef struct TS{
	triple data[N+1];
	int mu,nu,tu;//行数,列数,非零元个数
}TS;

TS M,T;//定义一个三元组顺序表



//三元组表的建立
void creat(){
	int r,c,x;M.tu=0;//行 列 值 下表
	printf("请输入稀疏矩阵的行数和列数:");
	scanf("%d%d",&M.mu,&M.nu);
	printf("请输入值:");
	for(r=1;r<=M.mu;r++)
		for(c=1;c<=M.nu;c++)
		{
			scanf("%d",&x);
			if(x)
			{
				M.tu++;
				M.data[M.tu].i=r;
				M.data[M.tu].j=c;
				M.data[M.tu].e=x;
			}
		}
}


//转置三元组表
void fasttrans(){
	int num[N],cpot[N],col,p,q;
	T.nu=M.mu;
	T.mu=M.nu;
	T.tu=M.tu;
	if(T.tu)
	{
		for(col=1;col<=M.nu;col++)
			num[col]=0;
		for(p=1;p<=M.tu;p++)
		{
			col=M.data[p].j;
			num[col]++;
		}
		cpot[1]=1;
		for(col=2;col<=M.nu;col++)
			cpot[col]=cpot[col-1]+num[col-1];
		for(p=1;p<=M.tu;p++)
		{
			col=M.data[p].j;
			q=cpot[col];
			T.data[q].i=M.data[p].j;
			T.data[q].j=M.data[p].i;
			T.data[q].e=M.data[p].e;
			cpot[col]++;
		}
	}
}

//输出
void output(TS A)
{
	int p;
	for(p=1;p<=A.tu;p++)
		printf("%3d%3d%3d\n",A.data[p].i,A.data[p].j,A.data[p].e );
}

void main(){
	creat();
	printf("输出转置前的:\n");
	output(M);
	printf("输出转置后的:\n");
	fasttrans();
	output(T);
}

13.二分查找

//2022.12.2二分查找
#include<stdio.h>
#include<stdlib.h>

#define N 20
typedef struct sqlist
{
	int *elem;         
	int length;        
	int listsize;      
}sql;



sql L;

void InitList()
{
	L.elem=(int *)malloc(N*sizeof(int));  
	if(!L.elem)
		exit(0);						 
	L.listsize=N;                         
	L.length=0;							 
}

void input(int n)
{
	int i;
	printf("请输入值:");
	for(i=1;i<=n;i++)
		scanf("%d",&L.elem[i]);
	L.length=n;
}

void output()
{
	int i;
	for(i=1;i<=L.length;i++)
		printf("%d ",L.elem[i]);
	printf("\n");
}
int x=0;			

int binsearch(int key)
{
	int low,high,mid;
	low=1;
	high=L.length;
	

	while (low<=high)
	{
		x++;
		mid=(low+high)/2;
		if (key<L.elem[mid])
			high=mid-1;
		else if (key==L.elem[mid])
			return mid;
		else 
			low=mid+1;
		
	}
	return 0;

}
int main()
{
	int n,key;
	InitList();
	printf("请输入个数:");
	scanf("%d",&n);
	input(n);
	output();
	printf("请输入要查找的值:\n");
	scanf("%d",&key);
	if (binsearch(key)!=0)
		printf("查找成功,在:%d的位置",binsearch(key));
	else
		printf("查找失败!");
	printf("%d",x);
	return 0;
}

14.深度搜索

#include <stdio.h>
#include <stdlib.h>
#define N 20
typedef struct link
{
	int data;//代表数据域
	struct link *next;//代表指针域,指向后继元素
}link;//link为节点名,每个节点都是一个link结构体

link *b[N];//头节点
//定义链队列的类型
typedef struct linkqueue{
	link *front;//队头指针
	link *rear;//队尾指针
}linkq;

linkq q;//定义一个链队列

//初始化链队列
void initqlink(){
	q.front=(link *)malloc(sizeof(link));
	if (!q.front)
		exit(0);
	q.front->next=NULL;
	q.rear=q.front;//空队列
}

//入队(插入)
void enqlink(int e){
	link *p;
	p=(link *)malloc(sizeof(link));
	if (!p)
		exit(0);
	p->data=e;
	p->next=NULL;
	q.rear->next=p;//连接作用
	q.rear=p;//修改队尾指针
}

//出队(删除)
int deqlink(){
	link *p;
	int x;
	if(q.rear==q.front){
		printf("空队列,不进行删除\n");
		exit(0);
	}
	p=q.front->next;
	x=p->data;
	q.front->next=p->next;
	if(p==q.rear)//如果队尾指针没有,空队列
		q.rear=q.front;
	free(p);
	return x;

}
//创建邻接链表
void creat(int n){
	int u,v;
	link *p;
	for(u=0;u<n;u++)
		b[u]=NULL;
	scanf("%d%d",&u,&v);
	while(u>=0)
	{
		p=(link*)malloc(sizeof(link));
		p->data=v;
		p->next=b[u];
		b[u]=p;
		scanf("%d%d",&u,&v);
	}
}
//遍历
void output(int n){
	link *p;
	int u;
	for(u=0;u<n;u++)
	 {
		printf("%5d",u);
		p=b[u];
		while(p)
		{
			printf("->");
			printf("%2d",p->data);
			p=p->next;
		}
		printf("\n");
	}
}
//深度优先搜索
int vst[N]={0};
void dfs(int u){
    link *p;
    int v;
    printf("%d ",u);
    vst[u]=1;       //已被访问

    p=b[u];
    while(p)
    {
        v=p->data;
        if(vst[v]==0)
            dfs(v);         //递归
        p=p->next;
    }

}
//广度优先搜索
int bvst[N]={0};
void bsf(int u){
    link *p;
    int v,x;
    printf("%d ",u);
    bvst[u]=1;
    enqlink(u);
    while(q.front!=q.rear){
    v=deqlink();
    p=b[v];
    while (p)
    {
    x=p->data;
    if(bvst[x]==0){
        printf("%d ",x);
        bvst[x]=1;
        enqlink(x);
    }
    p=p->next;
    }
    }
}
void main(){
	initqlink();
	creat(6);
	printf("邻接表为:\n");
	output(6);
	printf("深度优先搜索结果:");
    dfs(0);
    printf("\n");
    printf("广度优先搜索结果:");
    bsf(0);
}

15.二叉树

#include<stdio.h>
#include<stdlib.h>
//定义二叉链表节点的类型
typedef struct bitnode {
	char data;
	struct bitnode* lchild, * rchild;
}bitnode;

//先建立二叉链表
bitnode* creat() {
	bitnode* T;
	char ch;
	scanf("%c", &ch);
	if (ch == '.')
		return NULL;
	else
	{
		T = (bitnode*)malloc(sizeof(bitnode));
		if (!T)
			exit(0);
		T->data = ch;				//按照根左右的顺序建立
		T->lchild = creat();
		T->rchild = creat();
		return T;
	}
}
//先序遍历
void preorder(bitnode* T) {
	if (T)
	{
		printf("%c", T->data);    //访问根
		preorder(T->lchild);
		preorder(T->rchild);
	}
}
//中序遍历
void inorder(bitnode* T) {
	if (T) {
		inorder(T->lchild);
		printf("%c", T->data);
		inorder(T->rchild);
	}
}
//后序遍历
void postorder(bitnode* T) {
	if (T) {
		inorder(T->lchild);
		inorder(T->rchild);
		printf("%c", T->data);
	}
}
//子叶个数
int leafsum(bitnode* T) {
	if (!T)				//如果没有元素则没有叶子节点
		return 0;
	else if (!T->rchild && !T->lchild)		//如果都没有左孩子和右孩子返回1
		return 1;
	else
		return leafsum(T->lchild) + leafsum(T->rchild);	//若其他情况继续递归执行函数
}
//先序求结点个数
int n=0;
void count(bitnode *T){
	if(T)
	{
		n++;
		count(T->lchild);
		count(T->rchild);
	}
}
//后序求二叉树的深度
int depth(bitnode *T){
	int h,l,r;
	if(!T)
		h=0;
	else
	{
		l=depth(T->lchild);
		r=depth(T->rchild);
		h=(l>r?l:r)+1;
	}
	return h;
}
void main() {
	bitnode* root;
	printf("请输入二叉树:");
	root = creat();
	printf("先序建立结果:");
	preorder(root);
	printf("\n先序建立结果:");
	inorder(root);
	printf("\n先序建立结果:");
	postorder(root);
	printf("\n叶子结点的总数:");
	printf("%d", leafsum(root));
	count(root);
	printf("\n结点的个数为:%d",n);
	printf("\n树的深度为:%d",depth(root));
}

16.哈夫曼树

#include<stdio.h>
#define N 100
#define HUGE 100
//定义哈夫曼树的结点类型
typedef struct hnode {
	int weight;  //权值
	int parent;	//双亲
	int lchild;	//左孩子
	int rchild; //右孩子
}hnode;

hnode h[N];		//存放所有节点
int w[N] = { 0 };		//存放权值

//输入叶子结点的个数和权值
int n, m;
void input() {
	printf("请输入叶子的个数:");
	scanf("%d", &m);
	printf("请输入%d个叶子结点的权值:", m);
	for (int i = 0; i < m; i++)
		scanf("%d", &w[i]);
	n = 2 * m - 1;		//所有节点的个数
}

//初始化,说明
void init() {
	for (int i = 0; i < n; i++)
	{
		h[i].weight = w[i];
		h[i].parent = -1;
		h[i].lchild = -1;
		h[i].rchild = -1;
	}
}

int minmun() {
	int min, k;
	min = w[0];
	k = 0;
	for (int i = 0; i < n; i++)
		if (w[i] < min && w[i] != 0)
		{
			min = w[i];
			k = i;
		}
	w[k] = HUGE;		//把挑走的值改掉,防止重复挑选
	return k;
}

void creat() {
	int l, r;//最小值下标
	

	for (int i = m; i < n; i++)
	{
		l = minmun();
		r = minmun();
		h[i].lchild = l;
		h[i].rchild = r;
		h[i].weight = h[l].weight + h[r].weight;
		h[l].parent = i;
		h[r].parent = i;
		w[i] = h[i].weight;
	}

}

void output() {
	for (int i = 0; i < n; i++)
		printf("%5d%5d%5d%5d%5d\n", i, h[i].weight, h[i].parent, h[i].lchild, h[i].rchild);
}

void main()
{
	input();
	init();
	creat();
	printf("  下标  权值  双亲  左孩子  右孩子\n");
	printf("-----------------------------------------\n");
	output();
}