循环双向链表

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
typedef struct node{
	char name[20];
	struct node* llink;
	struct node* rlink;
}stu;
int num(stu*  Head)//计数 
{
	stu* temp=Head;
	int i=0;
	while(temp->rlink!=Head)
	{
		temp=temp->rlink;
		i++;
	}
	return i;
}
stu* create(int n)
{
	stu* Head,*pNew,*pEnd;
	Head=(stu*)malloc(sizeof(stu));
	Head->llink=NULL;
	Head->rlink=NULL;
	pNew=pEnd=Head;
	while(n--)
	{
		pNew=(stu*)malloc(sizeof(stu));
		printf("请输入姓名:");
		scanf("%s",pNew->name);
		pNew->llink=pEnd;
		pNew->rlink=NULL;
		pEnd->rlink=pNew;
		pEnd=pNew;
	}
	pEnd->rlink=Head;
	Head->llink=pEnd;
} 
stu* insert(stu* Head,int n)
{
	stu* pNew,*temp;
	int sum,i;
	pNew=(stu*)malloc(sizeof(stu));
	printf("请输入插入姓名:");
	scanf("%s",pNew->name);
	sum=num(Head);
	if(n>sum+1)  
	{
		 printf("插入出错\n");
		 return NULL;
	}
	temp=Head->rlink;
	//printf("\n----\n");
	for(i=1;i<n;i++)
	{
		temp=temp->rlink;
	}
	pNew->llink=temp->llink;
	pNew->rlink=temp;
	temp->llink->rlink=pNew;
	temp->llink=pNew;
	printf("插入成功\n");
	return Head;
}
int   del(stu* Head,int n)
{
	stu* temp=Head;
	for(int i=1;i<n;i++)
	{
		temp=temp->rlink;
		if(temp==Head)
		{
			return 0;
		}
	}
	temp->rlink=temp->rlink->rlink;
	temp->rlink->llink=temp; 
	return 1;
}
stu* rep(stu* Head,int n)
{
	stu* temp=Head;
	for(int i=1;i<=n;i++)
	{
		temp=temp->rlink;
	}
	printf("请输入存入信息:"); 
	scanf("%s",temp->name);
	printf("\n修改成功\n");
	return Head;
}
int  find(stu* Head,char *a)
{
	int i=1;
	stu* temp=Head->rlink;
	while(temp!=Head)
	{
			if(strcmp(temp->name,a)==0)
	         {
			 printf("\n找到了\n");
			 return i;
	          }
	          temp=temp->rlink;
	          i++;
	}
	printf("无此人\n");
	return 0;
}
void   dis(stu* Head)
{
	stu* temp;
	temp=Head->rlink;
	while(temp!=Head)
	{
		printf("%s  ",temp->name);
		temp=temp->rlink;
	}
}
int main()
{
printf("创建中......\n");
 	char b[20];
 	int choice,number,temp;
 	stu* Head;
 	
 	printf("请输入学生数量:");
 	scanf("%d",&number);
 	Head=create(number);
 	printf("--------------------------------------------\n");
 	printf("1.插入信息     2.删除信息\n");
 	printf("3.修改信息      4.查找信息\n");
 	printf("5.显示信息       6.退出\n"); 
 	printf("请输入选择功能:"); 
 	scanf("%d",&choice);
 	while(1)
 	{
 		switch(choice)
		 {
 			case 1: 
 				 printf("请输入插入位置:");
				  scanf("%d",&temp);
				  insert(Head,temp);
				  break; 
		    case 2:
		  		 printf("请输入删除位置:");
		  		 scanf("%d",&temp);
		  		 if(del(Head,temp)==0)
		  		 {
		  		  		printf("\n删除出错\n"); 
				   }else{
				   	printf("\n删除成功\n"); 
				   }
		  		 break;
 		     case 3:
 		     	printf("请输入修改位置:");
		  		 scanf("%d",&temp);
		  		 rep(Head,temp);
		  		 break;
		      case 4:
		      	printf("请输入查找信息:");
		      	scanf("%s",b);
		      	temp=find(Head,b);
		      	if(temp)  printf("此人在%d个\n",temp);
		      	break;
	      	  case 5:
	      	  	dis(Head);
	      	  	break;
      	  	case 6:
      	  		return 0;
      	  		break;
			 default:
			 		 printf("输入出错\n");
					   	
		 }
		 printf("\n请输入功能:");
		 scanf("%d",&choice);
	 }
}
通过学生姓名来实现,如需其他信息,可以添加

猜你喜欢

转载自blog.csdn.net/m0_37687058/article/details/72675274