C语言数据结构(链表)单向链表的创建删除逆序

课程作业要求随机生成N个200以内的数,删除大于100的数并逆序输出。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct node//定义链表
{
	int data;
    struct node * next;

}link;

link * create(int node_number)//创建链表
{
	link *head,*p,*s;
	int i,rand_number;
	if(node_number<1)//判断输入节点个数的正确性
    {
      printf("输入大于1的数字:");
	  exit(0);
	}
    p = head = (link*)malloc(sizeof(link));//分配头结点空间
	srand((unsigned) time(NULL));//随机种子生成
	for(i=1;i<=node_number;i++)
	{

	rand_number=  rand() % 200;

	s=(link*)malloc(sizeof(link));

	s->data=rand_number;//赋值随机数
	p->next = s;//P->next指向S
	p=s;//S赋给P
	}
	p->next = NULL;//最后一个节点为空
	return head;//返回头指针

}

void display(link *head)//显示链表内容
{
link *p;
p=head->next;
printf("链表:\n");
while(p!=NULL)
{
printf("%d ",p->data);

p=p->next;
}
printf("\n");
}

link *unturn(link *head)//单向链表反转
{
	 link   *p1 = NULL;
     link   *p2 = NULL;

    if (head == NULL)
    {
        return NULL;
    }
    p1 = head->next;
    while (p1->next != NULL)
    {
        p2 = p1->next;//p2为p1 的下一个节点
        p1->next = p2->next;//p1指向p2的下一个节点
        p2->next = head->next;//p2->next回指向head->next
        head->next = p2;//head->next指向p2
    }
    return head;
}

link * delete1(link *head)//删除函数
{   link *p1,*p2;
    p1=head;
    if(head==NULL)
	{
		printf("\nlist null!\n");
		return NULL;
	}
	while(p1->next!=NULL)    //如果节点不为空
    {  p2 = p1;
	   p1=p1->next;

	   if(p1->data > 100)  //判断是否大于一百
	   {
			if(p2 == head) //如果删除的是首节点
			{   p2->next=p1->next;
				free(p1);
				p1 = p2;
			}
		    else if(p1->next == NULL)// 如果删除的是尾节点
			{
				p2->next= NULL;
				free(p1);
				p1 = p2;
			}
			else
			{
				p2->next = p1->next;//如果是中间节点
				free(p1);
				p1 = p2;
			}
	   }
	}

    return head;
}

int main(void)
{
int node_number;
link *head;
printf("输入链表的节点数:\n");
scanf("%d",&node_number);
printf("\n");
head=create(node_number);//创建链表
display(head);
head=delete1(head);//删除节点
printf("\n");
printf("删除后的");
display(head);
head=unturn(head);//逆序
printf("逆序后的");
display(head);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值