C语言循环链表

/* Note:Your choice is C IDE */
#include "stdio.h"
#include "stdlib.h" 
//结点结构体
typedef struct n
{
	//数据域
	union
	{
		char d[20];
		int len;	
	};	
	struct n *next;//指针域
}list;

//创建头结点
list *cj()
{
	list *h=malloc(sizeof(list));//申请内存0;
	if(h!=NULL)
	{
		h->len=0;
		h->next=h;	
	}
	return h;		
}
//输出函数
void shuchu(list *h)
{
	list *p=h;
	if(h->next==NULL)
	{
		printf("链表为空!\n");	
	}
	else
	{
		printf("链表长度:%d\n链表数据如下:\n",h->len);
		while((p=p->next)!=h)
		{
			printf("%s\t",p->d);	
		}
		printf("\n");
	}
}
//插入函数
void charu(list *p,list *s)
{
	s->next=p->next;
	p->next=s;	
}
//删除函数
void shanchu(list *p)//删除p的后一个结点
{
	list *q=p->next;//将待删除的结点保存
	p->next=p->next->next;
	free(q);	
}
//输入函数
void shuru(list *h,int n)
{
	int i;
	list *p;
	list *s=h;
	for(i=1;i<=n;i++)
	{
		p=malloc(sizeof(list));
		if(p==NULL)
		{
			printf("申请失败!\n");	
		}
		else
		{
			printf("请输入第%d个结点的数据:",i);
			scanf("%s",&p->d);
			p->next=h;
			s->next=p;//加入链表
			s=p;//尾结点后移
			
			h->len++;		
		}
	}	
}
//查找函数  定位查找
list *chazhao(list *h,int wz)
{
	int i;
	list *p=h;
	for(i=0;i<wz;i++)//循环wz次找到结点
	{
		p=p->next;	
	}
	return p;//返回你查找结点
}
//修改函数
void xiugai(list *h,int wz)
{
	int i;
	list *p=h;
	for(i=0;i<wz;i++)
	{
		p=p->next;	
	}
	printf("请输入修改数据:");
	scanf("%s",&p->d);
}

void main()
{
	int n,wz;
	list *p,*q;
	
    list *h=cj();//调用创建函数创建头结点
    shuchu(h);//
    printf("请输入结点个数:");
    scanf("%d",&n);
    shuru(h,n);
    shuchu(h);
    
    //插入函数  参数(链表、位置、插入结点)
    p=malloc(sizeof(list));
    if(p==NULL)
    {
    	printf("申请内存失败!\n");	
    }
    else
    {
    	printf("请输入插入位置:");
    	scanf("%d",&wz);
    	printf("请输入插入数据:");
    	scanf("%s",&p->d);
    	p->next=NULL;
    	//调用查找函数,找到待插位置的前一个结点
    	q=chazhao(h,wz-1);
    	//调用插入函数
    	charu(q,p);
    	
    	h->len++;
    	
    	shuchu(h);
    	
    		
    }
    
    //删除函数
    printf("请输入删除位置:");
    scanf("%d",&wz);
    //调用查找函数找到待删除结点前一个
    q=chazhao(h,wz-1);
    shanchu(q);
    h->len--;
    
    shuchu(h);
    
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.海上月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值