-
设计内容
建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。程序能实现以下功能:
-
建立链表
-
显示链表
-
查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息。
-
删除链表中指定学号的结点。
-
在链表中指定的位置插入一个新结点(学号不能和其他结点重复)。
2. 具体代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>/*头文件*/
struct Node
{
char name[20];
long id;
char gender[10];
int age;
int score;
struct Node *next;
};/*创建结构体*/
typedef struct Node ListNode;/*声明*/
ListNode *build(int n) /*创建链表*/
{
ListNode *head;
ListNode *p,*pre;
int i;
head=(ListNode *)malloc(sizeof(ListNode));/*为头节点分配内存空间*/
head->next=NULL;
pre=head;
for(i=1;i<=n;i++)/*通过for循环不断加入新的结点*/
{
printf("请输入第 %d 个学生的信息:\n",i);
p=(ListNode *)malloc(sizeof(ListNode));
printf("请输入姓名:\n");/*输入数据*/
scanf("%s",&p->name);
printf("请输入学号:\n");
scanf("%ld",&p->id);
printf("请输入性别:\n");
scanf("%s",&p->gender);
printf("请输入年龄:\n");
scanf("%d",&p->age);
printf("请输入分数:\n");
scanf("%d",&p->score);
pre->next=p;
pre=p;
}
p->next=NULL;
return head;/*返回这个链表的首地址*/
}
void output(ListNode *h) /*输出链表*/
{
ListNode *p;
if(h==NULL)
printf("无数据\n");
else
{
p=h->next;
while(p)
{
printf("%s,%ld,%s,%d,%d",p->name,p->id,p->gender,p->age,p->score);
p=p->next;
printf("\n");
}
}
}
void Insert(ListNode *h,int n) /*插入链表结点*/
{
ListNode *q,*p;
int j,i;
printf("插入数据的位置:\n");
scanf("%d",&i);
if(i<1 || i>n+1)
printf("错误,请重新输入.\n");
else
{
j=0;
p=h;
while(j<i-1)
{
p=p->next;
j++;
}
q=(ListNode *)malloc(sizeof(ListNode));/*为要插入的结点分配内存空间*/
printf("请输入姓名:\n");/*赋值操作*/
scanf("%s",&q->name);
printf("请输入学号:\n");
scanf("%ld",&q->id);
printf("请输入性别:\n");
scanf("%s",&q->gender);
printf("请输入年龄:\n");
scanf("%d",&q->age);
printf("请输入分数:\n");
scanf("%d",&q->score);
q->next = p->next; /*调整指针域*/
p->next=q;
}
}
void deletes(ListNode *h,int n) /*函数功能:删除链表结点*/
{
ListNode *p,*q;
int j,i;
printf("请输入要删除的数据的位置:");
scanf("%d",&i);
if(i<1 || i>n)/*如果位置超出了1和n的范围的话则打印出错误信息*/
printf("错误,请重新输入.\n");
else
{
j=0;
p=h;
while(j<i-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);//释放q指向的结点
printf("第%d个数据已删除:\n",i);
}
}
find(ListNode *h)/*按序号查找链表*/
{
int ii,ij;
printf("请输入要查询的序号:\n");
scanf("%d",&ii);
ListNode *p;
p=h->next;
if(p==NULL)
printf("未找到\n");
else
ij=1;
while(p!=NULL&&ij<ii)
{
p=p->next;
ij++;
}
if(ii==ij)
output(p);
else
printf("未找到:\n");
}
void txtleletters() /*主标题*/
{
printf("1.建立 \n");
printf("2.显示 \n");
printf("3.查找 \n");
printf("4.插入 \n");
printf("5.删除 \n");
printf("6.退出 \n");
printf("请输入要选择功能的序号:");
}
void main() /*主函数*/
{
ListNode *h;
ListNode *f;
h=NULL;
int i, n;
txtleletters();
while (1)
{
printf("\n");
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入创建链表节点的个数:\n"); /*输入创建链表结点的个数*/
scanf("%d",&n);
h=build(n);
printf("现有成员的信息:\n");
output(h);
txtleletters();
break;
case 2:
printf("现有成员信息: \n");
output(h);
txtleletters();
break;
case 3:
find(h);
txtleletters();
break;
case 4:
Insert(h,n);
printf("现有成员信息:\n");
output(h);
txtleletters();
break;
case 5:
deletes(h,n);
printf("现有成员信息: \n");
output(h);
txtleletters();
break;
case 6:
return;
break;
default:
printf("错误的选项,请重新选择:\n");
}
}
}