/*
**本段程序用于单向链表的常规操作
其中包含的操作有:
随机创建中指定范围(由X和Y确定)的是个随机数、
对已经创建的单向链表排序、插入任意个数随机数、
删除链表中的一个数据、销毁整个链表、查找数据、
遍历数据;
本段代码仅用于初学者学习使用,如有不妥之处或
者其他意见、建议请联系作者:
*/
/*包含头文件*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*X,Y为生成随机数范围*/
#define X 0
#define Y 100
/*创建链表数据类型*/
typedef struct _Lnode
{
int data;
struct _Lnode *next;
}Lnode;
/*该函数用于生成菜单选项*/
void Choices(void)
{
printf("Please choose options:\n");
printf("Creat---1\n"); //创建
printf("Order---2\n"); //从小到大排序
printf("Visit---3\n"); //遍历链表
printf("Insert--4\n"); //插入n随机数
printf("Delete--5\n"); //删除单个数据
printf("Destory-6\n"); //销毁链表
printf("LookTab-7\n"); //查找数据
printf("Exit----0\n"); //退出
}
/*创建链表子函数*/
Lnode *Creat_link(void)
{
Lnode *head=NULL,*q=NULL,*s=NULL;
int i,k;
srand( (unsigned)time( NULL ) ); //修改rand()函数种子
k=rand()%(Y-X+1)+X; //生成指定范围随机数
s=(Lnode *)malloc(sizeof(Lnode)); //分配内存
s->data=k; //赋值
s->next=NULL; //创建头节点
head=s;
q=s;
for(i=0;i<9;i++)
{
k=rand()%(Y-X+1)+X;
s=(Lnode *)malloc(sizeof(Lnode)); //分配内存
s->data=k;
q->next=s;
s->next=NULL;
q=s;
}
return head; //返回头结点
}
/*遍历子函数*/
void Vist_link(Lnode *h)
{
Lnode *look=NULL;
if(h==NULL)
printf("\n\tEmpty Link!\t\n");
else
{
look=h;
while(look!=NULL)
{
printf("%d ",look->data);
look=look->next;
}
printf("\n");
}
return;
}
/*排序
修改不等号可以改变升降序
*/
void Order_Link(Lnode *h)
{
Lnode *p,*q;
int swapdata;
if(h==NULL)
printf("Error! Empty Link.");
else
{
p=h;
q=h->next;
while(q!=NULL)
{
if(p->data>q->data)
{
swapdata=p->data;
p->data=q->data;
q->data=swapdata;
p=h;
q=h->next;
}
else
{
p=q;
q=q->next;
}
}
printf("After Order:\n");
Vist_link(h);
}
}
/*插入数据
注意:插入之前需要先排序,
这是有序插入
*/
Lnode *Insert_Order(Lnode *h,int *n)
{
printf("Please input the number of data(s) that you want to add:\n");
scanf("%d",n);
int i,k;
Lnode *p,*q,*s,*f;
for(i=0;i<*n;i++)
{
k=rand()%(Y-X+1)+X;
p=h;
f=h;
q=h->next;
if(k<p->data)
{
s=(Lnode *)malloc(sizeof(Lnode));
s->data=k;
s->next=p;
f=s;
}
else
{
while(q!=NULL)
{
if(k>=p->data&&k<=q->data)
{
s=(Lnode *)malloc(sizeof(Lnode));
s->data=k;
s->next=q;
p->next=s;
}
p=q;
q=q->next;
}
if(k>p->data)
{
s=(Lnode *)malloc(sizeof(Lnode));
s->data=k;
s->next=NULL;
p->next=s;
}
}
}
printf("Add complete!\n");
Vist_link(f);
return f;
}
/*查找*/
int LookTab(Lnode *h,int *f)
{
if(h==NULL)
{
printf("\n\tEmpty! Fail to find!\t\n");
return 0;
}
printf("please input the number you want to find:\n");
scanf("%d",f);
Lnode *p;
p=h;
while(p!=NULL)
{
if(p->data==*f)
{
printf("\tFind It!\t\n");
return 1;
}
p=p->next;
}
printf("\n\tCan't find the data!\t\n");
return 0;
}
/*删除*/
Lnode *Delete_data(Lnode *h)
{
int dele;
Lnode *p,*q;
Vist_link(h);
printf("Choose the number you want to delete:\n");
scanf("%d",&dele);
p=h;
q=h->next;
if(p->data==dele)
{
free(p);
return q;
}
else
{
while(q!=NULL)
{
if(q->data==dele)
{
if(q->next==NULL)
{
free(q);
p->next=NULL;
break;
}
else
{
p->next=q->next;
free(q);
break;
}
}
p=q;
q=q->next;
}
return h;
}
}
/*销毁*/
Lnode *Destory(Lnode *h)
{
Lnode *p,*q;
if(h==NULL)
{
printf("\tEMPTY LINK!\t\n");
return NULL;
}
p=h;
q=h->next;
do
{
free(p);
p=q;
q=q->next;
}while(q!=NULL);
printf("\tDESTORY COMPLETE!\t\n");
return NULL;
}
int main()
{
Lnode *head=NULL;
int choose=10;
int add=1;
while(choose)
{
Choices();
scanf("%d",&choose);
system("CLS");
switch(choose)
{
case 1: head=Creat_link();
case 3: Vist_link(head); system("pause");break;
case 2: Order_Link(head); system("pause");break;
case 4: head=Insert_Order(head,&add); system("pause");break;
case 5: head=Delete_data(head); system("pause");break;
case 6: head=Destory(head); system("pause");break;
case 7: LookTab(head,&add); system("pause");break;
case 0: printf("Thanks to use!\n");break;
default: break;
}
}
return 0;
}
C语言学习笔记——单向链表的简单操作
于 2019-01-04 15:53:01 首次发布