您的位置:首页 > 理论基础 > 数据结构算法

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

2014-11-12 20:36 393 查看
课程作业要求随机生成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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐