hday4(循环链表增删改查)

#ifndef __DD_H__
#define __DD_H__

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

typedef char datedef[20];

typedef struct Node       //定义单向链表结点
{
	union                 //数据域
	{
		int len;          //头结点的数据域 (链表长度)
		datedef date;     //其他结点的数据域
	};
	struct Node *next;    //指针域
}*looplist,Looplist;

looplist creat(int flag);                 //创建新链表

void output(looplist L);                  //遍历

int h_insert(looplist L,datedef s);       //头插
int r_del(looplist L);                    //尾插

int p_find(looplist L,int n);             //查看位置元素
int e_search(looplist L,datedef e);       //查找元素位置

void L_free(looplist L);                 //链表释放

#endif  




looplist creat(int flag)     //创建链表新结点
{
	looplist L=(looplist)malloc(sizeof(struct Node));    
	if(L==NULL)	return NULL;
	if(flag==1)               //头结点
	{
		L->len=0;
		L->next=L;
	}
	else if(flag==0)          //其他结点
	{
		strcpy(L->date," ");
		L->next=NULL;          //初始化
	}
	return L;
}

void output(looplist L)       //遍历
{   
	if(L->next==L||L==NULL)
	{
		printf("遍历失败\n");
		return;
	}
	printf("输出的元素是:\n");
	looplist p=L;
	while(p->next!=L)
	{
		p=p->next;
		printf("%s\t",p->date);
	}
	puts("");
	printf("该链表有%d个元素。\n",L->len);
}

int h_insert(looplist L,datedef s)  //头插
{
	if(L==NULL)
	{
		printf("头插失败\n");
		return -1;
	}
	looplist q=creat(0);
	if(q==NULL) return -1;
	strcpy(q->date,s);
	q->next=L->next;
	L->next=q;
	L->len++;
	return 0;
}

int r_del(looplist L)              //尾删
{
	if(L==NULL||L->next==L)
	{
		printf("尾删失败\n");
		return -1;
	}
	looplist p=L;
	while(p->next->next!=L)
	{
		p=p->next;
	}
	looplist s=p->next;
	p->next=L;
	free(s);
	s=NULL;
	L->len--;
	return 0;
}

int p_find(looplist L,int n)                 //查看位置元素
{
	if(L==NULL||n<1||n>L->len)
	{
		printf("位置不合法\n");
		return -1;
	}
	looplist p=L;
	for(int i=0;i<n;i++)
	{
		p=p->next;
	}
	printf("你要找的第%d个元素为:%s\n",n,p->date);
	return 0;
}

int e_search(looplist L,datedef e)         //查找元素位置
{
	if(L==NULL||L->next==L) 
	{
		printf("查找失败\n");
		return -1;
	}
	looplist p=L;
	int n=1;
	while(p->next!=L)
	{
		p=p->next;
		if(strcmp(p->date,e)==0) 
		{
			printf("你要找的元素在第%d个\n",n);
			return n;
		}
		n++;
	}
	if(n>L->len)
	{
		printf("查找失败\n");
		return -1;
	}
}

void L_free(looplist L)                  //链表释放
{
	if(L==NULL)	return;
	int n=L->len;
	for(int i=0;i<n;i++)
	{
		r_del(L);                       //尾删  
	}
	free(L);
	L=NULL;
}




int main(int argc,const char *argv)
{

	looplist L=creat(1);

	int n;
	datedef s,e;

	printf("你要头插的元素个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("你要头插的元素是:");
		scanf("%s",s);
		h_insert(L,s);       //头插
	}
	output(L);

	printf("你要尾删的元素个数:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		r_del(L);       //尾插
	}
	output(L);

	printf("你要查看第几个元素");
	scanf("%d",&n);
	p_find(L,n);                    //查看位置元素

	printf("你要查找的元素是:");
	scanf("%s",e);
	n=e_search(L,e);               //查找元素位置

	L_free(L);                    //链表释放

}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值