一、实验内容
1.随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。
2.遍历单向链表。
3.把单向链表中元素逆置(不允许申请新的结点空间)。
4.在单向链表中删除所有的偶数元素结点。
5.编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;//元素类型
typedef struct LNode
{
ElemType data;//数据域整型
struct LNode *next;//next指针
}LNode,*LinkList;
LinkList CreateListRand(void)//创建
{
int num,i;
LinkList s,head=(LinkList)malloc(sizeof(LNode));//s指针动态分配
head->next=NULL;//初始化让头结点指向空值
printf("请输入你要生成多少随机数:\t");
scanf("%d",&num);
srand((unsigned)time(NULL));//随机时间种子
for(i=0;i<num;i++)
{
s=(LinkList)malloc(sizeof(LNode));//循环生成结点用随机数赋值
s->data=rand()%100+1;
s->next=head->next;
head->next=s;//用指针域连接结点
}
return head;//返回头指针
}
void InsertIncr(LinkList head,ElemType x)//插入即添加
{
LinkList s,q=head,p=head->next;//把头指针和头指针域接过来
s=(LinkList)malloc(sizeof(LNode));//新生成一个结点
s->data=x;//把获得的值装在s指向结点的数据域中
while(p&&p->data<x)//p指向的结点不为空并且数据域小于x的时候
{
q=p;
p=p->next;
}
s->next=p;
q->next=s;
}
LinkList CreateListIncr(void)
{
int num,i;
LinkList s,head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
printf("请输入你要生成多少个随机数: ");
scanf("%d",&num);
srand((unsigned)time(NULL)) ;
for(i=0;i<num;i++)
{
InsertIncr(head,rand()%100+1);
}
return head;
}
void PrintLinkList(LinkList L)
{
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void nizhi(LNode *head)
{
LinkList r,m=NULL,p=head->next ;
while(p){
r=m;m=p;
p=p->next;
m->next=r;
}
head->next=m;
}
void DelEvenLinkList(LinkList head)
{
LinkList q=head,p=head->next;
while(p)
{
if(p->data%2==0)
{
q->next=p->next;
free(p);
p=q->next;
}
else
{
q=p;p=p->next;
}
}
}
int main()
{
LinkList head=CreateListRand();
printf("当先顺序为:\t");
PrintLinkList(head);//未排序打印
printf("逆置后顺序为:\t");
nizhi(head);//逆置
PrintLinkList(head);//再打印逆置后的
head=CreateListIncr();
printf("随机生成数的递增排序:\t") ;
PrintLinkList(head); //打印递增的
return 0;
}
程序演示:
分析:首先通过链表生成结点并赋值,让后通过逐步比较进行大小排序,实现递增或者递减排序,后部分通过生成时就直接排序。已有数通过%2的方式直接判断