建立学生信息(每个学生只包含学号和姓名两项)带头结点的单链表,并实现插入、删除和查找操作。具体要求如下:
(1)用头插法建立一个有n个学生(n的值由符号常量定义)的带头结点的单链表,并输出单链表中所有学生信息。
(2)在带头结点的单链表的第i个元素之前插入一个新学生,并输出插入后所有学生信息。
(3)删除带头结点的单链表中第i个学生,并输出删除后的单链表中各元素值。
(4)在带头结点的单链表中查找某个学号的学生,如果查找成功,则显示该学生信息,否则显示查无此人。
(5)统计带头结点的单链表的表长。
(6)用尾插法建立一个存储学生信息的带头结点的双向链表,任意指定一个位置后,输出该结点之前的第2个学生信息和它之后的第2个学生信息。
(7)基于上述双向链表,将其拆分成两个链表,一个是男生链表,一个是女生链表。
#include
#include
#include
#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&&knext;
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&&knext;
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&&knext;
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");
}