2024-8-2数据结构周末练习

1.链表

//头文件
#ifndef __FUNC__
#define __FUNC__
typedef int datatype;
typedef struct lklist
{
	union
	{
		int len;
		datatype data;
	}text;
	struct lklist*next;
}Linklist;
Linklist*create_linklist(void);
void insert_linklistbyhead(Linklist*head,datatype num);
void insert_linklistbyTail(Linklist*head,datatype num);
datatype delete_linklistByhead(Linklist*head);
void delete_linklistByTali(Linklist*head);
void insert_linklistByposition(Linklist*headi,datatype num,int n);
void show_linklist(Linklist*head);
void insert_linklistSort(Linklist*head,int num);
void insert_linklistSort2(Linklist*head,int num);
void recycle_linklist(Linklist*head);
datatype millddle_Node_linklist(Linklist*head);
void free_linklist(Linklist**phead);
void delete_linklistByposition(Linklist*head,int n);
#endif

链表.c

//创建一个空的单链表
#include <stdio.h>
#include <stdlib.h>
#include "./01_func.h"
Linklist*create_linklist(void)
{
	Linklist*head=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==head)
	{
		printf("创建空链表失败");
		return NULL;
	}
	head->next=NULL;
	head->text.len=0;
	return head;
}

//头插法-插入数据
void insert_linklistbyhead(Linklist*head,datatype num)
{
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");	
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->next=head->next;
	head->next=temp;
	head->text.len++;
	return;
}

//从头部开始删除数据
datatype delete_linklistByhead(Linklist*head)
{
	if(head->next==NULL)
	{
		printf("链表为空,删除失败");
		return (datatype)-1;
	}
	Linklist*temp=head->next;
	head->next=temp->next;
	datatype num=temp->text.data;
	free(temp);
	temp=NULL;
	head->text.len--;
	return num;
}


//从尾部插入数据
void insert_linklistbyTail(Linklist*head,datatype num)
{
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
	}	
	temp->text.data=num;
	temp->next=NULL;
	Linklist*p=head;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	return;
}

//从尾部开始删除数据
void delete_linklistByTali(Linklist*head)
{
	if(NULL==head->next)
	{
		printf("链表为空,删除失败");
	}
//找倒数第二个节点
	Linklist*p=head;
	while(p->next->next!=NULL)
	{
		p=p->next;
	}
	free(p->next);
	p->next=NULL;
	head->text.len--;
	return;
}

//按位置插入数据
void insert_linklistByposition(Linklist*head,datatype num,int n)
{
	if(n<1)
	{
		printf("插入位置非法");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(NULL==p)
		{
			printf("插入位置非法");
			return;
		}
	}
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
		return;
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	return;
}

//按位置删除数据
void delete_linklistByposition(Linklist*head,int n)
{
	//判断列表是佛为空
	if(NULL==head->next)
	{
		printf("列表为空,删除失败\n");
		return;
	}
	if(n<1)
	{
		printf("删除位置非法\n");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(p->next==NULL)
		{
			printf("删除位置非法\n");
			return;
		}
	}
	Linklist*temp=p->next;
	p->next=temp->next;
	free(temp);
	head->text.len--;
	return;
}

//升序插入
void insert_linklistSort(Linklist*head,int num)
{
	Linklist*p=head;
	while(p->next!=NULL)
	{
		if(num<p->next->text.data)
		{
			break;
		}
		p=p->next;
	}
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	return;
}	

//降序插入
void insert_linklistSort2(Linklist*head,int num)
{
	Linklist*p=head;
	while(p->next!=NULL)
	{
		if(num>p->next->text.data)
		{
			break;
		}
		p=p->next;
	}
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	return;
}	

//翻转链表(不借助新链表)
void recycle_linklist(Linklist*head)
{
	Linklist*p,*q;
	p=head->next;
	head->next=NULL;
	while(p!=NULL)
	{
		q=p->next;
		p->next=head->next;
		head->next=p;
		p=q;
	}
	return;
}

//遍历一次,找中间节点
datatype millddle_Node_linklist(Linklist*head)
{
	if(head->next==NULL)
	{
		printf("链表为空,没有中间节点");
		return (datatype)-1;
	}
	Linklist*low,*fast;
	fast=low=head->next;
	while(fast!=NULL&&fast->next!=NULL)
	{
		low=low->next;
		fast=fast->next->next;
	}
	return low->text.data;
}


//释放链表
void free_linklist(Linklist**phead)
{
	Linklist*temp=NULL;
	while((*phead)->next!=NULL)
	{
		temp=(*phead)->next;
		(*phead)->next=temp->next;
		free(temp);
		(*phead)->text.len--;
	}
	free(*phead);
	*phead=NULL;
	return;
}

//遍历链表
void show_linklist(Linklist*head)
{
	Linklist*p=head;
	while(p->next!=NULL)
	{
		p=p->next;
		printf("%d ",p->text.data);
	}
	putchar(10);
	return;
}


//函数调试 main.c
#include <stdio.h>
#include "./01_func.h"
int main(int argc, const char *argv[])
{
	Linklist*head;
	head=create_linklist();

	insert_linklistSort2(head,60);
	insert_linklistSort2(head,120);
	insert_linklistSort2(head,90);
	insert_linklistSort2(head,30);

	show_linklist(head);
	datatype num;
	num=millddle_Node_linklist(head);
	printf("millddle=%d是链表中间节点\n",num);

	delete_linklistByposition(head,2);
	show_linklist(head);
	return 0;
}

2.单项循环链表

头文件

#ifndef __FUNC__
#define __FUNC__
typedef int datatype;
typedef struct lklist
{
	union
	{
		int len;
		datatype data;
	}text;
	struct lklist*next;
}Linklist;
Linklist*create_looplinklist(void);
void insert_looplinklistbyhead(Linklist*head,datatype num);
void show_looplinklist(Linklist*head);
datatype delete_looplinklistByhead(Linklist*head);
void insert_looplinklistbyTail(Linklist*head,datatype num);
void delete_looplinklistByTali(Linklist*head); 
void insert_looplinklistByposition(Linklist*head,datatype num,int n);
void delete_looplinklistByposition(Linklist*head,int n);
#endif


02_looplinklist.c

//创建一个空的单项循环链表
#include <stdio.h>
#include <stdlib.h>                                    
#include "./01_func.h"
Linklist*create_looplinklist(void)
{
    Linklist*head=(Linklist*)malloc(sizeof(Linklist));
    if(NULL==head)
    {
        printf("创建空链表失败");
        return NULL;
    }
    head->next=head;
    head->text.len=0;
    return head;
}

//头插法-插入数据
void insert_looplinklistbyhead(Linklist*head,datatype num)
{
    //创建新节点
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
    if(NULL==temp)
    {
        printf("创建节点失败,插入失败");                   
    }
    temp->text.data=num;
    temp->next=NULL;
    temp->next=head->next;
    head->next=temp;
    head->text.len++;
    return;
}

//从头部开始删除数据
datatype delete_looplinklistByhead(Linklist*head)
{
	if(head->next==NULL)
	{
		printf("链表为空,删除失败");
		return (datatype)-1;
	}
	Linklist*temp=head->next;
	head->next=temp->next;
	datatype num=temp->text.data;
	free(temp);
	temp=NULL;
	head->text.len--;
	return num;
}

//从尾部插入数据
void insert_looplinklistbyTail(Linklist*head,datatype num)
{
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
	}	
	temp->text.data=num;
	temp->next=NULL;
	Linklist*p=head;
	while(p->next!=head)
	{
		p=p->next;
	}
	temp->next=head;
	p->next=temp;
	head->text.len++;
	return;
}

//从尾部开始删除数据
void delete_looplinklistByTali(Linklist*head)
{
	if(NULL==head->next)
	{
		printf("链表为空,删除失败");
	}
//找倒数第二个节点
	Linklist*p=head;
	while(p->next->next!=head)
	{
		p=p->next;
	}
	free(p->next);
	p->next=head;
	head->text.len--;
	return;
}

//按位置插入数据
void insert_looplinklistByposition(Linklist*head,datatype num,int n)
{
	if(n<1)
	{
		printf("插入位置非法");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(NULL==p)
		{
			printf("插入位置非法");
			return;
		}
	}
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
		return;
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->next=p->next;
	p->next=temp;
	head->text.len++;
	return;
}


//按位置删除数据
void delete_looplinklistByposition(Linklist*head,int n)
{
	//判断列表是是否为空
	if(NULL==head->next)
	{
		printf("列表为空,删除失败\n");
		return;
	}
	if(n<1)
	{
		printf("删除位置非法\n");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(p->next==head)
		{
			printf("删除位置非法\n");
			return;
		}
	}
	Linklist*temp=p->next;
	p->next=temp->next;
	free(temp);
	head->text.len--;
	return;
}


//遍历单项循环链表
void show_looplinklist(Linklist*head)
{
	Linklist*p=head;
	while(p->next!=head)
	{
		p=p->next;
		printf("%d ",p->text.data);
	}
	putchar(10);
	return;
}


03_main.c

#include <stdio.h>
#include <stdlib.h>
#include "01_func.h"
int main(int argc, const char *argv[])
{
	Linklist*head=create_looplinklist();
	insert_looplinklistbyhead(head,60);
	insert_looplinklistbyhead(head,70);
	insert_looplinklistbyhead(head,80);
	insert_looplinklistbyhead(head,90);

	delete_looplinklistByhead(head);

	insert_looplinklistbyTail(head,50);
	insert_looplinklistbyTail(head,40);
	insert_looplinklistbyTail(head,30);

	delete_looplinklistByTali(head);

	show_looplinklist(head);

	insert_looplinklistByposition(head,85,1);

	delete_looplinklistByposition(head,1);

	show_looplinklist(head);

	return 0;
}

3.双向链表

头文件
#ifndef __FUNC__
#define __FUNC__
typedef int datatype;
typedef struct lklist
{
	union
	{
		int len;
		datatype data;
	}text;
	struct lklist*next;
	struct lklist*prev;
}Linklist;
Linklist*creat_Bilooplinklist();
void insert_Bilooplinklistbyhead(Linklist*head,datatype num);
void show_Bilooplinklist(Linklist*head);
void insert_BilooplinklistbyTail(Linklist*head,datatype num);
datatype delete_BilooplinklistByhead(Linklist*head);
void delete_BilooplinklistByTali(Linklist*head);
void insert_BilooplinklistByposition(Linklist*head,datatype num,int n);
void delete_BilooplinklistByposition(Linklist*head,int n);
#endif


02_Bilooplinklist.c
#include <stdio.h>
#include <stdlib.h>
#include "./01_func.h"

//创建一个空的双向链表
Linklist*creat_Bilooplinklist()
{
    Linklist*head=(Linklist*)malloc(sizeof(Linklist));
    if(NULL==head)
    {
        printf("创建空链表失败");
        return NULL;
    }
    head->next=NULL;
	head->prev=NULL;
    head->text.len=0;
    return head;
}

//头插法插入数据
void insert_Bilooplinklistbyhead(Linklist*head,datatype num)
{
    //创建新节点
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
    if(NULL==temp)
    {
        printf("创建节点失败,插入失败");                   
    }
    temp->text.data=num;
    temp->next=NULL;
	temp->prev=NULL;

    temp->next=head->next;
    head->next=temp;

	if(temp->next!=NULL)
	{
		temp->next->prev=temp;
	}
	temp->prev=head;
    head->text.len++;
    return;
}


//遍历单项循环链表
void show_Bilooplinklist(Linklist*head)
{
	Linklist*p=head;
	while(p->next!=NULL)
	{
		p=p->next;
		printf("%d ",p->text.data);
	}
	putchar(10);
	return;
}

//从头部开始删除数据
datatype delete_BilooplinklistByhead(Linklist*head)
{
	if(head->next==NULL)
	{
		printf("链表为空,删除失败");
		return (datatype)-1;
	}
	Linklist*temp=head->next;
	head->next=temp->next;
    if(head->next==NULL)
	{    
    temp->next->prev=head;    
    }
	datatype num=temp->text.data;
	free(temp);
	temp=NULL;
	head->text.len--;
	return num;
}



//从尾部插入数据
void insert_BilooplinklistbyTail(Linklist*head,datatype num)
{
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
	}	
	temp->text.data=num;
	temp->next=NULL;
	temp->prev=NULL;
	Linklist*p=head;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	temp->next=p->next;
	p->next=temp;
	temp->prev=p;
	head->text.len++;
	return;
}

//从尾部开始删除数据
void delete_BilooplinklistByTali(Linklist*head)
{
	if(NULL==head->next)
	{
		printf("链表为空,删除失败");
	}
//找倒数第二个节点
	Linklist*p=head;
	while(p->next->next!=NULL)
	{
		p=p->next;
	}
	free(p->next);
	p->next=NULL;
	head->text.len--;
	return;
}

//按位置插入数据
void insert_BilooplinklistByposition(Linklist*head,datatype num,int n)
{
	if(n<1)
	{
		printf("插入位置非法");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(NULL==p)
		{
			printf("插入位置非法");
			return;
		}
	}
	Linklist*temp=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==temp)
	{
		printf("创建节点失败,插入失败");
		return;
	}
	temp->text.data=num;
	temp->next=NULL;
	temp->prev=NULL;

	temp->next=p->next;
	p->next=temp;

	temp->prev=p;
	if(p->next==NULL)
	{
		temp->next->prev=temp;
	}
	
	head->text.len++;
	return;
}


//按位置删除数据
void delete_BilooplinklistByposition(Linklist*head,int n)
{
	//判断列表是是否为空
	if(NULL==head->next)
	{
		printf("列表为空,删除失败\n");
		return;
	}
	if(n<1)
	{
		printf("删除位置非法\n");
		return;
	}
	Linklist*p=head;
	for(int i=0;i<n-1;i++)
	{
		p=p->next;
		if(p->next==NULL)
		{
			printf("删除位置非法\n");
			return;
		}
	}
	Linklist*temp=p->next;
	p->next=temp->next;
	
	if(p->next!=NULL)
	{
		temp->next->prev=p;
	}

	free(temp);
	head->text.len--;
    retunrn;
}


03_main.c

#include <stdio.h>
#include <stdlib.h>
#include "01_func.h"
int main(int argc, const char *argv[])
{

Linklist*head=creat_Bilooplinklist();
insert_Bilooplinklistbyhead(head,5);
insert_Bilooplinklistbyhead(head,10);
insert_Bilooplinklistbyhead(head,15);
insert_Bilooplinklistbyhead(head,20);
insert_Bilooplinklistbyhead(head,25);

show_Bilooplinklist(head);

insert_BilooplinklistbyTail(head,0);

delete_BilooplinklistByhead(head);

show_Bilooplinklist(head);

delete_BilooplinklistByTali(head);

show_Bilooplinklist(head);

insert_BilooplinklistByposition(head,100,2);
show_Bilooplinklist(head);
	
	
delete_BilooplinklistByposition(head,3);	
show_Bilooplinklist(head);
	

	return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值