数据结构--链表实现学生信息的创建,插入,删除(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;
}