2024-02-23 作业

作业要求:

1.自己实现单向循环链表的功能
2.整理思维导图
3.复习前面顺序表和链表的代码,重写链表逆置函数

 

1.自己实现单向循环链表的功能

运行代码:
main.c
#include "loop_list.h"
int main(int argc, const char *argv[])
{
	loop_p H = creat_head();
	//头插1 2 3 4
	insert_head(H,4);
	insert_head(H,3);
	insert_head(H,2);
	insert_head(H,1);
	print(H);
	//按位置插
	insert_pos(H,5,5);
	insert_pos(H,2,5);
	print(H);
	//尾删
	del_tail(H);
	//按位置删除
	del_pos(H,2); 
	print(H);
	
	return 0;
}
loop_list.c
#include "loop_list.h"
loop_p creat_head()
{
	loop_p H=(loop_p)malloc(sizeof(loop_list));
	if(H==NULL){
		printf("申请失败\n");
		return NULL;
	}
	H->len=0;
	H->next=H;
	return H;
}
loop_p creat_node(datatype data)
{
	loop_p new=(loop_p)malloc(sizeof(loop_list));
	if(new==NULL){
		printf("申请失败节点\n");	
		return NULL;
	}
	new->data=data;
	return new;
}
//头插
void insert_head(loop_p H,datatype data)
{
	if(H==NULL){
		printf("入参失败\n");
		return;
	}
	loop_p new=creat_node(data);
	new->next=H->next;
	H->next=new;
	H->len++;
}
//按位置插入
void insert_pos(loop_p H,int pos,datatype data)
{
	if(H==NULL){
		printf("入参失败\n");
		return;
	}else if(pos>H->len+1||pos<=0){
		printf("输入位置有误\n");
		printf("----\n");
		return;
	}
	loop_p new=creat_node(data);
	loop_p p=H;
	for(int i=1;i<pos;i++){
		p=p->next;	
	}//p在pos位前一位
	new->next=p->next;
	p->next=new;
	H->len++;

}
//尾删
void del_tail(loop_p H)
{
	if(NULL==H){
		printf("入参失败\n");
		return;
	}
	if(H==H->next){
		printf("数据为空\n");
		return;
	}
	loop_p p=H->next;
	while((p->next)->next!=H){
		p=p->next;
	}
	free(p->next);
	p->next=H;
	H->len--;

}
//按位置删除
void del_pos(loop_p H,int pos)
{
	if(NULL==H){
		printf("入参失败\n");
		return;
	}
	if(H==H->next){
		printf("数据为空\n");
		return;
	}else if(pos<=0||pos>=H->len){
		printf("位置输入有误\n");
	}
	loop_p p=H;//指向第一个数据
	for(int i=1;i<pos;i++){
		p=p->next;
	}
	loop_p temp=p->next->next;
	free(p->next);
	p->next=temp;

}
//输出
void print(loop_p H)
{
	if(NULL==H){
		printf("打印入参失败\n");
		return;
	}
	loop_p p=H->next;
//循环输出两次
	for(int i=0;i<N;i++){
		while(p!=H){
			printf("%d->",p->data);
			p=p->next;
		}
		p=p->next;
	}
	putchar(10);
}
loop_list.h
#ifndef __LOOP_LIST_H__
#define __LOOP_LIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define N 2
typedef int datatype;
typedef struct loop_list
{
	union
	{
		int len;
		datatype data;
	};
	struct loop_list *next;
}loop_list,*loop_p;

//创建单向循环链表
loop_p creat_head();
//创建结点
loop_p creat_node(datatype data);
//头插
void insert_head(loop_p H,datatype data);
//按位置插入
void insert_pos(loop_p H,int pos,datatype data);
//尾删
void del_tail(loop_p H);
//按位置删除
void del_pos(loop_p H,int pos);
//输出
void print(loop_p H);
#endif
运行截图:

3.复习前面顺序表和链表的代码,重写链表逆置函数

运行代码:
void overturn_link(link_p H)
{
#if 0 
	分配了新空间
	for(int i=0;i<H->len;i++){
		insert_pos(H,H->len-i+1,(H->next)->data);
		del_head(H);
	}
#endif
#if 1 
	link_p p=H->next->next;
	H->next->next=NULL;
	link_p q=p->next;
	while(NULL!=p){
		p->next=H->next;
		H->next=p;
		p=q;
		if(q!=NULL){
			q=q->next;
		}
	}
#endif

}
运行截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值