欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构--链表实现学生信息的创建,插入,删除(C语言实现)

程序员文章站 2022-03-22 20:03:09
...
#include<cstdlib>
struct student{
	long no;//学号
	char name[20];//姓名
	char addr[30];//地址
	struct student *next;
};

typedef struct student LIST;
//链表五步法
//1.申请内存2.内存next=NULL 3.与前一个节点链接prev->next=cur 4.写入数据 5.重复1~4的步骤 
LIST* Create_LIST(LIST *head, int n)
{
	LIST  *prev, *cur;
	head=NULL;
	
	for(int i=0; i<n; i++){
		cur=(LIST*)malloc(sizeof(LIST));
		if(head==NULL)
		head=cur;
		else{
			prev->next=cur;
		}
		prev=cur;
		scanf("%d%s%s", &cur->no, cur->name, cur->addr);
				
	}
return head;
}




void Display_LinkList(LIST *head)
{
	LIST *p=head;

	while(p!=NULL){	
		printf("%d %s %s\n", p->no, p->name, p->addr);
		p=p->next;
	}
} 


/*
链表的插入分三种情况 
1.在头结点之前
2.在第一个结点和最后一个结点之间
3.在最后一个结点之后 


*/

LIST* Insert_List(LIST *head, LIST *s )
{
	
	LIST *p=head, *pre;
	if(head==NULL){ 		//如果链表为空 
		head=s; 			//s结点就是表的第一个结点,让头指针h指向该结点 
		s->next=NULL;		//s的指针域为NULL 
	}
	else{
		while((s->no>p->no)&&(p->next!=NULL))//在链表中查找要插入的位置 
		{
			pre=p;			//pre指向p指向的节点之前的结点 
		p=p->next;
		}
	
		if(s->no<=p->no)	//如果要插入的结点小于等于 p所指的结点 
		{
			if(head==p )	//1.在头结点之前插入,    如果要插入的位置在第一个结点之前 
			{
				head=s;		//让头指针指向该结点 
				s->next=p;	//将s结点指向p结点 
			}
			else   			//2.在第一个结点和最后一个结点之间插入新结点 
			{
				pre->next=s;//将前一个结点的指针域 指向该结点 
				s->next=p;	//将当新结点的指针域指向p结点 
			}	
		}
		else				//3.在最后一个结点之后插入新结点,    如过要插入的结点位于最后一个结点之后 
		{
			p->next=s;  	//将最后一个结点即p结点的指针域 指向s 
			s->next=NULL;	//令新结点的指针域为NULL 
		}	
	}
	
return head;	
}

LIST* Delete_Node(LIST *h, long no) 
{
	LIST *p, *pre;
	if(h==NULL)//如果链表为空则不能删除结点 
	{
		printf("the list is NULL, you can't delete the Node!\n");
	return NULL;		//返回空指针 
	}

	p=h;		//将p指向第一个结点 
	while(p->no!=no&&p->next!=NULL)	//如果当前结点不是要删除的结点 
	{
		pre=p;		//pre指向p指向的结点 
	p=p->next;
	}
	
	if(p->no==no)		//如果p指向的结点是要删除的结点 
	{
		if(p==h) 		//如果要删除的结点是第一个结点 
			h=p->next;		//则头指针指向 第二个结点 
		else			//如果要删除的结点不是第一个结点 
			pre->next=p->next; //p结点之前的结点指向p结点之后的结点 
		
		free(p);		//释放p结点 
		printf("the Node is deleted sucessly!\n");
	}
	else//如果没有找到要删除的结点 
		printf("there is no Node to be delete!\n");

return h;
}



int main()
{
	int n;
	LIST *head, *s;
	long no; 
	scanf("%d", &n);
	head=Create_LIST(head,n);
	printf("学号  姓名  地址\n");
	Display_LinkList(head);
	
	printf("请输入要插入的节点"); 
	s=(LIST*)malloc(sizeof(LIST)); 
	scanf("%d %s %s", &s->no, &s->name, &s->addr); 
	
	 
	head=Insert_List( head, s);
	Display_LinkList(head);
	
	printf("请输入要删除的节点学号");
	scanf("%d", &no); 
	head=Delete_Node(head, no);
	Display_LinkList(head);


return 0;
}