1、函数说明以及结构构造
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int data;
struct ListNode* next;
};
struct ListNode* Printlist(struct ListNode* head); //0、打印
struct ListNode* createlist1();//1、正常输入输出
struct ListNode* createlist2();//2、第一个数据为随机值,但是有利于结点删除
struct ListNode* deletelist(struct ListNode* head, int m); //3、对于小于m的数删除
struct ListNode* Reversecreatelist();// 4、顺序输入逆序输出
2、主函数
//主函数
int main()
{
struct ListNode * p, * head1, *head2, *head3,*head4;
// 1、
head1 = createlist1();
Printlist(head1);
//2、
head2 = createlist2();
Printlist(head2);
//3、实现对小于m 的数进行的删除操作
int m;
scanf("%d", &m);
head3 = deletelist(head2, m);
Printlist(head3);
//4、顺序输入逆序输出
head4= Reversecreatelist();
Printlist(head4);
}
3、打印
struct ListNode* Printlist(struct ListNode* head)
{
struct ListNode* p;
for (p = head; p; p = p->next)
{
printf("%d ", p->data);
}
}
4、正常输入输出
struct ListNode* createlist1()//输入第一个数据存在
{
struct ListNode* p, * head, * tail;
head = tail = NULL;//初始化
int n;
scanf("%d", &n);
while (n != 0)// n!=0 实现多次输入
{
p = (struct ListNode*)malloc(sizeof(struct ListNode));//一个要分配空间
p->data = n;//开始对链表赋值
if (head == NULL) head = p;//第一个数据为空时,让两个指针保证相同
else tail->next = p;// 尾巴的下一个数据为p;
tail = p;
p->next = NULL; //记得把下一个数据赋为空
scanf("%d", &n);
}
return head;
}
5、第一个数据为随机值,但是有利于结点删除
struct ListNode* createlist2()
{
struct ListNode* p, * head, * tail;
tail = (struct ListNode*)malloc(sizeof(struct ListNode*));//给tail初始化,但是不能为空,否则程序挂掉
head = tail;
int n;
scanf("%d", &n);
while (n != 0)
{
p = (struct ListNode*)malloc(sizeof(struct ListNode));//记得初始化
p->data = n;
//不用判断是否为空,直接对尾节点进行操作
tail->next = p;
tail = p;
p->next = NULL;
scanf("%d", &n);
}
return head;
}
/这种方法有利于把正常的第一个数据放到第二个数据来看,有利于我们第一个数据对于m进行比较,如果用第一种方案输入,那就做不到对第一个数据对m的比较,除非分布操作
6、删除
struct ListNode* deletelist(struct ListNode* head, int m)
{
struct ListNode* p;
p = head;//对p直接进行操作,相当于对head 进行间接操作
while (p->next) //就是p->next!=NULL,因为第一个数不存在 ,
{
if (p->next->data < m)
{
p->next = p->next->next; //相当于小于的时候,p的下个数跳到了下下个数,head的下个数发生改变
}
else p = p->next;
}
return head->next; //因为第一个数不存在
}
7、顺序输入逆序输出
struct ListNode* Reversecreatelist() //相当于从头节点不断输入
{
struct ListNode* head,*p;
head = NULL;
int n;
scanf("%d", &n);
while (n != 0)
{
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = n;
p->next = head;
head = p;
//p->next=NULL //不用进行改步操作,因为head=NULL,已经有保证了
scanf("%d", &n);
}
return head;
}