c语言
- 首先创建单链表结构 2.实现插入函数 3.实现删除元素函数 4.实现打印函数 5.记录链表中要删除元素的个数 6.通过循环和删除函数实现单链表中的元素删除
#include<stdio.h>
#include<stdlib.h>
typedef struct Stu
{
int data;
struct Stu *next;
}Stu;
typedef struct LinkList
{
Stu * next;
int length;
}LinkList;
void InsertLinkList(LinkList * linkList, int pos, int n);//向单链表插入指定数据
void PrinttLinkList(LinkList * linkList);//遍历打印单链表数据
void DeleLinkList(LinkList * linkList, int n);//删除单链表中指定的元素
int main()
{
int n = 0;
int m = 0;
scanf("%d", &n);
LinkList linkList = {0};
linkList.length = 0;
for (int i = 0; i<n; i++)
{
scanf("%d", &m);
InsertLinkList(&linkList, i + 1, m);
}
scanf("%d", &m);
Stu * node = linkList.next;
int count = 0;
for (int i = 0; i<n; i++)
{
if (node->data == m)
count++;
node = node->next;
}
for (int i = 0; i < count; i++)
{
DeleLinkList(&linkList, m);
}
printf("%d\n", linkList.length);
PrinttLinkList(&linkList);
return 0;
}
void InsertLinkList(LinkList * linkList, int pos, int m)
{
Stu * node = (Stu *)malloc(sizeof(Stu));//开辟空间
node->data = m; //保存要插入的数据
node->next = NULL;
if (pos == 1)
{
node->next = linkList->next;
linkList->next = node;
linkList->length++;
return;
}
Stu * currNode = linkList->next;
if (currNode)
{
for (int i = 1; i<pos - 1; i++) //循环找到要插入的前一个结点
{
currNode = currNode->next;
}
node->next = currNode->next;
currNode->next = node;
linkList->length++;
}
}
void PrinttLinkList(LinkList * linkList)
{
Stu * node = linkList->next;
for (int i = 0; i<linkList->length; i++)
{
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
void DeleLinkList(LinkList * linkList, int m)
{
Stu * node = linkList->next;
Stu * preNode = NULL;
for (int i = 1; node && i <=linkList->length; i++)
{
if (node->data == m)
{
if (i == 1) //如果删除的位置是第一结点
{
linkList->next = node->next;
free(node);
linkList->length--; //释放内存,长度-1
return;
}
else
{
preNode->next = node->next;
free(node);
linkList->length--; //释放内存,长度-1
return;
}
}
preNode = node; //删除位置的前一个结点
node = node->next; //删除位置的结点
}
}