您的位置:首页 > 其它

双向循环链表的创建修改插入删除操作

2014-08-03 18:40 411 查看
#include<stdio.h>
#include<malloc.h>
#define N 3   /*定义链表的长度*/
#define NULL 0
int m=N;
struct stu  /*定义一个结构体变量*/
{
	int num;
	char name[20];
	struct stu *before;
    struct stu *next;
};	

/*主函数*/
void main()
{

	struct stu *putin(void);                /////链表输入函数
	void putout(struct stu *p,int n);       /////链表输出函数
	struct stu *insert(struct stu *p);      /////链表插入函数
	struct stu *del(struct stu *p);         /////链表删除函数
	void search(struct stu *p);             /////链表查询函数
	struct stu *revise(struct stu *p);      /////链表修改函数
    struct stu *suo;int n,flag=1;   
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
	suo=putin();
	while(flag)
	{	printf("请选择想要进行的操作:\n1:查询, 2:修改, 3:插入, 4:删除, 5:输出,6:结束  ");
    	scanf("%d",&n);
    	switch(n)
		{
		  case 1:search(suo);break;
     	  case 2:suo=revise(suo);break;
		  case 3:suo=insert(suo);break;
		  case 4:suo=del(suo);break;
		  case 5:putout(suo,m);break;
		  case 6:flag=0;break;
		}
	    
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////	

/*下面的函数构进行链表的输入操作*/
 struct stu *putin(void)
{

    int i=0;
	struct stu *p1,*p2,*head;
	p1=p2=(struct stu *)malloc(sizeof(struct stu));
	head=NULL;
	printf("输入%d个学号和名字:\n",N);
	scanf("%d,%s",&p1->num,&p1->name);
	head=p2=p1; 
	for(i=0;i<N-1;i++)
	{
		p1=(struct stu*)malloc(sizeof(struct stu));
		scanf("%d,%s",&p1->num,&p1->name);
        p2->next=p1;p1->before=p2;
		p2=p1;
	}
	p2->next=head;
	head->before=p2;
	return(head);
}

 /*下面的函数进行链表输出操作*/
void putout(struct stu *p,int n)
{
	int i=0;
    struct stu *start;
	start=p;
	printf("从头到尾输出为:\n");
	while(i<n)
	{
		printf("No.:%d   name:%s\n",p->num,p->name);
		p=p->next;
		i++;
	}
	printf("\n从尾到头输出为:\n");
	p=start->before;
	while(i>0)
	{printf("No.:%d   name:%s\n",p->num,p->name);
	  p=p->before;
	  i--;
	}
	printf("从第二节点循环到第一个节点为:\n");
	p=start;
	p=p->next;
	while(i<n)
	{
		printf("No.:%d   name:%s\n",p->num,p->name);
		p=p->next;
		i++;
	}

}
/*下面表示链表的插入操作*/
struct stu* insert(struct stu *p)
{
	m++;
	int i=0,n=0;
	struct stu *p1,*p2;
	printf("您希望在第几个节点后插入?");
	scanf("%d",&n);
	p2=p1=p;
	if(n==0)
	{
		struct stu *pnew;
 	    pnew=(struct stu *)malloc(sizeof(struct stu));
		printf("请输入新同学的学号的姓名:");
    	scanf("%d,%s",&pnew->num,&pnew->name);
		p2=p->before;
		pnew->next=p;
		p->before=pnew;
		p2->next =pnew;
		pnew->before=p2;
		p=pnew;
	}
	else
	{
		while(i<n)
		{
		  p2=p1;
		  p1=p1->next;
		  i++;
		}
	    struct stu *pnew;
 	    pnew=(struct stu *)malloc(sizeof(struct stu));
     	printf("请输入新同学的学号和姓名:");
    	scanf("%d,%s",&pnew->num,&pnew->name);
 	    pnew->before=p2;
        p2->next=pnew;	
    	p1->before=pnew;
    	pnew->next=p1;
	}
	return(p);
}
/*链表删除操作*/
struct stu *del(struct stu *p)
{
	m--;
	int n,i=0;
	struct stu *p1,*p2;
	p2=p1=p;
	printf("需要删除第几个节点?");
	scanf("%d",&n);
	if(n==1)
	{
		p1=p1->next;
		p2=p2->before;
		p1->before=p2;
		p2->next=p1;
		p=p1;

	}
	else
	{
        while(i<n)
		{
		  p2=p1;
		  p1=p1->next;
		  i++;
		}
		p2->before->next=p1;
		p1->before=p2->before;
	}
	return(p);
}
/*下面的函数表示链表的查询*/
void search(struct stu *p)
{
	int n,i;
	printf("请输入希望查询的位置:");
	scanf("%d",&n);
	for(i=0;i<n-1;i++)	p=p->next;
	printf("No.:%d   name:%s\n",p->num,p->name);
}
/*下面的函数表示链表的修改*/
struct stu *revise(struct stu *p)
{
	struct stu *p1;
	int i,n;
	p1=p;
	printf("请输入希望修改的位置:");
	scanf("%d",&n);
	for(i=0;i<n-1;i++)
	p1=p1->next;
	printf("请输入修改的内容:");
    scanf("%d,%s",&p1->num,&p1->name);
	return(p);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐