数据结构-链表的插入和删除-单向链表
链表的插入删除-改进学生录入程序
改进单向链表学生成绩录入,增加添加删除函数,再输入结束后通过添加删除函数来更改链表,遍历输出。
单向链表实现
#include "stdafx.h"
struct Student
{
int grade;
struct Student *next;
};
typedef struct Student Node;
typedef Node* Ptr;
int main()
{
Ptr head;
int num;
Ptr Creatlink();
void Insert(Ptr head);
void Delete(Ptr head);
head = Creatlink();
printf_s("选择操作:1.插入。2.删除\n");
scanf_s("%d", &num);
if (num == 1)
{
Insert(head);
}
else if (num=2)
{
Delete(head);
}
return 0;
}
Ptr Creatlink()
{
Ptr head, previous, last;
int num;
head = (Ptr)malloc(sizeof(Node));
if (head == NULL)
{
printf_s("wrong!");
return NULL;
}
last = head;
scanf_s("%d", &num);
while (num != 0)
{
previous = last;
previous->grade = num;
last = (Ptr)malloc(sizeof(Node));
if (last == NULL)
{
printf_s("wrong!");
return NULL;
}
previous->next = last;
scanf_s("%d", &num);
}
previous->next = NULL;
free(last);
return head;
}
void Insert(Ptr head)
{
Ptr previous, last, temp;
int num, num1, i; //num是插入的成绩 num1是插入的位置
last = head;
printf_s("请输入要插入的成绩");
scanf_s("%d", &num);
printf_s("请输出要插入的位置");
scanf_s("%d", &num1);
//申请要插入的结点的空间 失败则退出
temp = (Ptr)malloc(sizeof(Node));
if (temp == NULL)
{
printf_s("wrong!");
return ;
}
temp->grade = num;
if(num==1) //如果插入点在第一个结点之前 将head指针指向第一个结点 (新结点成为第一个结点)
{
temp->next = head; //temp->next和head一样 现在指向原来的第一个结点
head = temp;
}
else //如果插入的不是第一个结点,找到位置正常插入即可。
{
for (i = num1; i > 1; i--) //last其实指向head
{
previous = last; //last指针后移到该添加的结点
last = last->next;
}
previous->next = temp; //上一个last结点next指针指向temp temp的next指针指向最后的last结点 成功添加
temp->next = last;
}
printf_s("插入成功 当前成绩为:");
while (head != NULL)
{
printf_s("%d\n", head->grade);
previous = head;
head = head->next;
free(previous);
}
}
void Delete(Ptr head)
{
Ptr previous, last;
int num;
last = head;
previous = NULL; //骚操作
printf_s("请输入要删除的成绩:");
scanf_s("%d", &num);
while (last->grade != num) //骚操作。如果删除是头结点 则这个循环一次都不执行,下面if判断语句执行
{
previous = last;
last = last->next;
}
if (previous!=NULL) //previous不是空 那么就是不删除头结点的情况
{
previous->next = last->next; //要删除的结点的前一个结点的next指针直接指向要删除结点的下一个结点 last没有链接再链表内了
free(last); //释放last结点
}
else //如果被删除的是第一个结点,将head指针指向第二个结点释放第一个结点
{
head = last->next;
free(last);
}
printf_s("删除成功 当前成绩为:");
while (head != NULL)
{
printf_s("%d\n", head->grade);
previous = head;
head = head->next;
free(previous);
}
}