数据结构:链表的应用--学生信息管理系统

建立学生信息(每个学生只包含学号和姓名两项)带头结点的单链表,并实现插入、删除和查找操作。具体要求如下:

(1)用头插法建立一个有n个学生(n的值由符号常量定义)的带头结点的单链表,并输出单链表中所有学生信息。

(2)在带头结点的单链表的第i个元素之前插入一个新学生,并输出插入后所有学生信息。

(3)删除带头结点的单链表中第i个学生,并输出删除后的单链表中各元素值。

(4)在带头结点的单链表中查找某个学号的学生,如果查找成功,则显示该学生信息,否则显示查无此人。

(5)统计带头结点的单链表的表长。

(6)用尾插法建立一个存储学生信息的带头结点的双向链表,任意指定一个位置后,输出该结点之前的第2个学生信息和它之后的第2个学生信息。

(7)基于上述双向链表,将其拆分成两个链表,一个是男生链表,一个是女生链表。

#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#define N 5
typedef struct student{
	int  num;
	char name[10];
	char sex[3];
}Student;

typedef struct node
{
	Student data;
	struct node *next;
}LNode,*LinkList;

typedef struct LNode
{ 
    Student data;
    struct LNode *prior,*next;
}DLNode,*DuLinkList;

void menu();
void out(LNode *head);
void CreateList(LNode *head);
void InsertList(LNode *head,int i,Student t);
void Delete(LinkList head,int i);
void Search(LNode* head);
void length(LNode *head);
void CreateDList(DuLinkList headt);
void Dout(DuLinkList headt);
void Dout2(DuLinkList headt,int i);
LinkList Split(LinkList head);

int main()
{
    LinkList head;
    LinkList head2;
    DuLinkList headt;
    headt=(DuLinkList)malloc(sizeof(DLNode));
     headt->next=NULL;
	 headt->prior=NULL;
	head=(LinkList)malloc(sizeof(LNode));
	 head->next=NULL;
    Student t;
    int m,n,j,h; 
	do{
		system("cls");
		menu();
		scanf("%d",&m);
		switch(m)
		{
			case 0:
			        CreateList(head);
			        system("pause");
			        break;
			case 1:
			        out(head);
			        system("pause");
			        break;
			case 2: 
			        printf("请输入你想插入的位置:");
                 	scanf("%d",&n);
			        InsertList(head,n,t);
			        printf("插入成功!\n\n");
			        out(head);
					system("pause");
					break;
			case 3:	
			        printf("请输入你想删除的位置:");
			        scanf("%d",&j);
					Delete(head,j);
					printf("删除成功\n");	
					system("pause");
					break;
			case 4: 
			        Search(head);
					system("pause");
					break;
			case 5: 
			        length(head);
				    system("pause");
				    break;
			case 6: 
			        CreateDList(headt);
				    system("pause");
				    break;
			case 7: 
			        Dout(headt);
				    system("pause");
				    break;
			case 8: 
			        printf("请输入结点位置:");
			        scanf("%d",&h);
					Dout2(headt,h);	
					system("pause");
			        break;
			case 9:
			        head2=Split(head);
			        out(head2);
			        out(head);
			        system("pause");
			        break;         	   	
		}
	}while(m!=10);
	return 0;
}
void CreateList(LNode *head)
{
	LinkList p ;
    int i;       
    printf("请开始建立学生信息\n\n");
    for(i=N;i>=1;i--)
    { 
        p=(LinkList)malloc(sizeof(LNode));
        p->next=NULL;
		printf("第%d位学生的学号、姓名、性别:",i);
		scanf("%d %s %s",&p->data.num,p->data.name,p->data.sex); 
		p->next=head->next;
		head->next=p;
	}
	printf("创建成功!\n");
}

void out(LNode *head)
{
    LinkList p; 
	p=head;
	printf("学号\t姓名\t性别\n");
	while(p->next!=NULL)
	{
	  p=p->next;
	  printf("%d\t%s\t%s\n",p->data.num,p->data.name,p->data.sex);
	}
}

void InsertList(LNode *head,int i,Student t)
{
	int k=0;
	LinkList s,p;
	p=head;
	printf("请输入学生的学号、姓名、性别:");
	scanf("%d %s %s",&t.num,t.name,t.sex); 
	while(p!=NULL&&k<i-1)
	{
		p=p->next;
		k++;
	}
	if(p==NULL)
	{
		printf("插入位置不合理\n");
	}
	s=(LinkList)malloc(sizeof(LNode));
	s->data=t;
	s->next=p->next;
	p->next=s;
}

void Delete(LinkList head,int i)
{
	LinkList r,p;
	int k=0;
	p=head;
	while(p&&k<i-1)
	{
		p=p->next;
		k++;
	}
	if(k>i-1||!(p->next))
	{
		printf("删除位置不正确\n");
	}
	r=p->next;
	p->next=r->next;
	free(r);
}

void Search(LNode *head)
{ 
	int number;
	LinkList p;
	p=head->next;
	printf("请输入想查找的学生学号:");
	scanf("%d",&number); 
	while(p!=NULL&&p->data.num!=number)
	{
	    p=p->next;
    }
    if(p==NULL)
    {
    	printf("查找失败");
	}
	else
	{
		printf("查找成功!\n\n");
		printf("学号\t姓名\t性别\n"); 
		printf("%d\t%s\t%s\n",p->data.num,p->data.name,p->data.sex);
	}
}

void length(LNode *head)
{
	int len=0;
	LinkList p;
	p=head;
	while(p->next!=NULL)
	{
		len++;
		p=p->next;
	}
	printf("单链表的表长=%d",len);
}

void CreateDList(DuLinkList headt)
{
	DuLinkList s,r;/*将新节点插入双链表的表尾,为此增加一个尾指针r,使其始终指向当前链表的尾结点 
	                 建立头结点L,定义一个尾指针r,并同时将r指向L; 
	                 通过for循环将信息一个个插入到链表表尾,指针域复制,指针域修改,最后那个结点要置空  */
	int i;       
	r=headt;
	for(i=1;i<=N;i++)
	{
		s=(DuLinkList)malloc(sizeof(DLNode));
		printf("第%d位学生的学号、姓名、性别:",i);
		scanf("%d %s %s",&s->data.num,s->data.name,s->data.sex); 
		r->next=s;
		s->prior=r;
	    r=s;
	}
	r->next=NULL;
}

void Dout(DuLinkList headt)
{
    DuLinkList p; 
	p=headt;
	int i;
	printf("学号\t姓名\t性别\n");
	while(p->next!=NULL)
	{
	  p=p->next;
	  printf("%d\t%s\t%s\n",p->data.num,p->data.name,p->data.sex);
	}
}

void Dout2(DuLinkList headt,int i)
{
	DuLinkList p; 
	int k=0;
	p=headt;
	while(p!=NULL&&k<i)
	{
		p=p->next;
		k++;
	}
	if(p->next->next!=NULL)
	{
	  printf("该结点之后的第2个学生信息\n");
	  printf("学号\t姓名\t性别\n");
	  printf("%d\t%s\t%s\n",p->next->next->data.num,p->next->next->data.name,p->next->next->data.sex); 
	}
	   else
	   {
	     printf("无法找到此结点之后第二个学生信息!\n");
	   }
    if(p->prior->prior!=NULL)
	{ 
	  printf("该结点之前的第2个学生信息\n");
	  printf("学号\t姓名\t性别\n");
	  printf("%d\t%s\t%s\n",p->prior->prior->data.num,p->prior->prior->data.name,p->prior->prior->data.sex); 
	}
	    else
	    {
	      printf("无法找到此结点之前第二个学生信息!\n");
	    }
}

LinkList Split(LinkList head)
{
	LinkList  p,q,r,head1;
	head1=(LinkList)malloc(sizeof(LNode));
	head1->next=NULL;
	r=head1;
	p=head;
	while(p->next)
	{ 
		if(strcmp(p->next->data.sex,"女")==0)
		{
			q=p->next;
			p->next=q->next;
			r->next=q;
			r=q;
		}
	else{
		    p=p->next;
	    }	
	}
	r->next=NULL;
	return head1; 	
}

void menu()
{
	printf("请输入选择:\n\n");
	printf("0.创建单链表\n");
	printf("1.输出单链表所有学生信息\n");
	printf("2.插入新学生信息\n");
	printf("3.删除学生信息\n");
	printf("4.查找学生信息\n");
	printf("5.显示单链表表长\n");
	printf("6.创建双向链表\n");
	printf("7.输出双向链表所有学生信息\n");
	printf("8.查找前后第二个结点的学生信息\n"); 
	printf("9.将单向链表拆成两个链表\n");
	printf("10.退出\n\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值