#include<stdio.h>
#include<stdlib.h>
//学生信息定义
typedef struct {
int num;//学号
char name[50];//姓名
char sex[5];//性别
int age;//年龄
}Student;
//定义链表的结构体
typedef struct node{
Student data;
struct node *next;
}ListNode,*List;
/*********************************
*函数功能:创建一个链表,并且输入学生信息
*参 数:无
*返 回 值:链表首结点的地址
**********************************/
ListNode *createLink()
{
int num,i;
//头结点
ListNode *head = (ListNode *)malloc(sizeof(ListNode));
ListNode *r,*s;
if(!head)
exit(-1);
r = head;
//请输入学生人数
printf("请输入学生人数:\n");
scanf("%d",&num);
for(i = 1;i <= num;i++)
{
s = (ListNode *)malloc(sizeof(ListNode));
printf("学号:");
scanf("%d",&s->data.num);
printf("姓名:");
scanf("%s",s->data.name);
printf("性别:");
scanf("%s",s->data.sex);
printf("年龄:");
scanf("%d",&s->data.age);
r->next = s;
//为了s指向下一个地址做准备
r = s;
}
//尾结点
r->next = NULL;
return head;
}
/*********************************
*函数功能:输出学生信息
*参 数:链表的首个节点
*返 回 值:无
**********************************/
void outLink(ListNode *head)
{
//计算表长
int length = 0;
//从头结点的下一个结点开始输出
ListNode *p = head->next;
printf("----------------学生信息表---------------\n");
printf("学号\t姓名\t性别\t年龄\t\n");
while(p != NULL)
{
//输出数据
printf("%d\t%s\t%s\t%d\t\n",p->data.num,p->data.name,p->data.sex,p->data.age);
//指针域后移
p = p->next;
//表长+1
length++;
}
printf("\n表长为:%d\n",length);
printf("\n");
}
/******************************************************
*函数功能:查找链表中的指定元素的位置
*参 数:*head:链表的首个节点,i:指定的位置
*返 回 值:成功返回:该结点的位置,失败返回:NULL
*******************************************************/
ListNode * findNode(ListNode *head,int i)
{
int j = 0;
ListNode *p = head;
//通过循环找到第i个结点
while(p->next && j < i)
{
//指针域后移,指向下一个结点
p = p ->next;
j++;
}
//查找到结点
if(j == i)
{
//返回该结点
return p;
}
else
{
//找不到指针
return NULL;
}
}
/*****************************************************************************
*函数功能:向链表中指定位置插入数据
*参 数:*head:链表的首个节点,i:指定的位置
*返 回 值:无
******************************************************************************/
void insertNode(ListNode *head,int i)
{
ListNode *p,*q;
//找到要插入的位置
p = findNode(head,i - 1);
if(p == NULL)
{
printf("没有找到位置\n");
}
//创建一个新的结点
q = (ListNode *)malloc(sizeof(ListNode));
//输入要插入学生的信息
printf("请输入要插入的学生信息:\n");
printf("学号:");
scanf("%d",&q->data.num);
printf("姓名:");
scanf("%s",q->data.name);
printf("性别:");
scanf("%s",q->data.sex);
printf("年龄:");
scanf("%d",&q->data.age);
//断链重连,并且这两条语句的顺序不可改变,否则新插入的结点将自己指向自己
q->next = p->next;
p->next = q;
}
/*****************************************************************************
*函数功能:删除链表中的结点
*参 数:*head:链表的首个节点,i:指定的位置
*返 回 值:无
******************************************************************************/
void deleteNode(ListNode *head,int i)
{
ListNode *p;
//查找结点
p = findNode(head,i - 1);
//删除结点
p->next = p->next->next;
}
int main()
{
//链表初始化
ListNode *head = createLink();
//输出链表
outLink(head);
insertNode(head,2);
//输出链表
outLink(head);
deleteNode(head,2);
outLink(head);
//while(1)
//{
// printf("1.插入 2.删除 0.退出 请选择:\n");
// scanf("%d",&ch);
// switch(ch)
// {
// case 1:
// printf("请输入要插入的位置和元素:");
// scanf("%d,%d",&i,&x);
// insertNode(head,i,x);
// //输出链表
// outLink(head);
// break;
// case 2:
// printf("请输入要删除的元素的位置:");
// scanf("%d",&i);
// deleteNode(head,i);
// //输出链表
// outLink(head);
// break;
// case 0:
// //退出
// exit(1);
// default:
// break;
// }
//}
return 0;
}
数据结构——链表(学生信息插入和删除)
最新推荐文章于 2023-05-26 19:52:40 发布