(1)定义单链表link2,产生10个1-100的随机整数,通过插入函数依次保存到带头结点的Link2中,并输出插入后的 link2元素序列。
(2)查找link2中第i个元素〈i由用户输入),输出第i个元素的值。
(3)调用删除函数删除 link2中第i个元素(i由用户输入),删除成功后输出删除后的link2的元素序列,删除失败则显示不存在这个数。
备注:产生随机数的方法srand((int)time(0)),rand();(随机函数所在头文件<stdlib.h>,时间函数所在头文件<time.h>)
#include <stdio.h>
#include <stdlib.h>
int ch,c;//ch选择变量,c是否继续的变量
typedef int elemtype;
typedef struct node
{
int date;
struct node *next;
}Linklist;
//初始化带头结点的单链表
Linklist *initlist()//初始化带头结点的单链表
{
Linklist *h;
h=(Linklist *)malloc(sizeof(Linklist));
h->next=NULL;
return h;
}
Linklist *getnum(Linklist *h,int c)//查找第i个结点
{
Linklist *p=h;
int j=0;
while(p->next&&j<c)
{
p=p->next;
j++;
}
if(c==j)return p;
else return NULL;
}
void intput(Linklist *h,int i,int x)
{
Linklist *p,*s;
p=getnum(h,i-1);//找到插入位置的前驱结点指针
s=(Linklist *)malloc(sizeof(Linklist));//给新节点分配空间
s->date=x;//x存入新结点的数据域
s->next=p->next;
p->next=s;
}
void printlinklist(Linklist *h)//输出链表
{
Linklist *p=h->next;
while(p!=NULL)//当前结点不为空
{
printf("%-4d",p->date);//输出当前结点的数据
p=p->next;//移动指针指向下一个结点
}
}
void find(Linklist *h)
{
printf("\n\n\t\t\t\t\t +---------------查找信息选择--------------+\n");
printf("\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | 1--按序号查找 2--按值查找 |\n");
printf("\t\t\t\t\t +-----------------------------------------+\n");
while(1)
{
printf("\t\t\t\t\t请输入你查找的选择:(1-2)");
scanf("%d",&ch);
switch(ch)
{
case 1:find1(h);break;
case 2:find2(h);break;
default:printf("\t\t\t\t\t请输入有效数字!");
}getchar();
printf("\n\t\t\t\t\t是否继续:是请输入'Y'或'y',否请输入'N'或'n':");
c=getchar();
printf("\t\t\t\t\t--------------------------------------------\n");
if(c=='Y'||c=='y')continue;
else if(c=='N'||c=='n')break;
}
}
int find1(Linklist *h)
{
Linklist *p;
int j=0,x;
p=h->next;
printf("\t\t\t\t\t请输入要查找元素的序号:");
scanf("%d",&x);
if(x<=0)return NULL;//指定的位置非法时返回NULL
p=h;
while(p->next!=NULL&&j<x)
{
p=p->next;//不是目标结点且有后继结点时继续查找
j++;
}
if(x==j)//找到目标结点,进行输出
printf("\t\t\t\t\t找到第%d个元素为: %d\n",x, p->date);
else printf("\t\t\t\t\t没有找到第%d个元素! \n",x);
return 0;
}
void find2(Linklist *h)
{
int i=1,f;
Linklist *p;
p=h->next;//指针指向首结点
printf("\t\t\t\t\t请输入要查找的数:");
scanf("%d",&f);
while(p!=NULL)
if(p->date!=f)
{
p=p->next;//取下一个结点,继续查找
i++;
}
else break;//找到,结束循环,进行输出
if(p!=NULL)
printf("\t\t\t\t\t已找到,位置是%d\n",i);
else printf("\t\t\t\t\t未找到\n");
}
void del(Linklist *h)
{
printf("\n\n\t\t\t\t\t +---------------删除信息选择--------------+\n");
printf("\t\t\t\t\t | |\n");
printf("\t\t\t\t\t | 3--按序号删除 4--按值删除 |\n");
printf("\t\t\t\t\t +-----------------------------------------+\n");
while(1)
{
printf("\n\t\t\t\t\t请输入你删除的选择:(3-4)");
scanf("%d",&ch);
switch(ch)
{
case 3:del3(h);break;
case 4:del4(h);break;
default:printf("\t\t\t\t\t请输入有效数字!");
}getchar();
printf("\n\t\t\t\t\t是否继续:是请输入'Y'或'y',否请输入'N'或'n':");
c=getchar();
printf("\t\t\t\t\t--------------------------------------------\n");
if(c=='Y'||c=='y')continue;
else if(c=='N'||c=='n')break;
}
}
int del3(Linklist *h)
{
Linklist *q,*p=h;
int d,j=1;
printf("\n\t\t\t\t\t请输入要删除的元素的位置:");
scanf("%d",&d);
if(d<=0)
{
printf("\t\t\t\t\t删除结点位置不合理!");
return NULL;
}
while(p->next!=NULL&&j<d)
{
p=p->next;
j++;
}
q=p->next;
p->next=q->next;
free(q);//清空该结点
printf("\t\t\t\t\t删除成功!\n");
printf("\t\t\t\t\t删除结点后单链表:\n");
printf("\t\t\t\t\t");
printlinklist(h);
if(p=p->next==NULL)
{
printf("\t\t\t\t\t删除结点位置不合理!");
return NULL;
}
}
int del4(Linklist *h)
{
Linklist *q,*p=h;
int d;
printf("\n\t\t\t\t\t请输入要删除的元素:");
scanf("%d",&d);
while(p->next!=NULL)//若p有后继结点
{
if(p->next->date==d)
{
q=p->next;//q标记被删除的节点
p->next=q->next;
free(q);
h->date--;
break;
}
p=p->next ;//不满足if继续指针后移
}
printf("\t\t\t\t\t删除成功!\n");
printf("\t\t\t\t\t删除结点后单链表:\n");
printf("\t\t\t\t\t");
printlinklist(h);
if(p->next==NULL)
{
printf("Not Find! \n");
return 0;
}
}
int main()
{
int e,i;
Linklist *head;
head=initlist();//初始化单链表
srand((int)time(NULL));
for(i=1;i<=10;i++)
{
e=rand()%100;
intput(head,i,e);//生成随机数插入单链表
}
while(1)
{
system("cls");
printf("\n\t\t\t\t\t生成的随机数单链表\n");//每次清屏都对链表进行输出
printf("\t\t\t\t\t");
printlinklist(head);
printf("\n\n\n");
printf("\t\t\t\t\t 信息功能选择 \n");
printf("\t\t\t\t\t++++++++++++++++++++++++++++++++++++++++++\n");
printf("\t\t\t\t\t+ 1--查找 +\n");
printf("\t\t\t\t\t+ 2--删除 +\n");
printf("\t\t\t\t\t+ 3--退出系统 +\n");
printf("\t\t\t\t\t++++++++++++++++++++++++++++++++++++++++++\n");
printf("\n\t\t\t\t\t请输入你要进行的操作:(1-3)");
scanf("%d",&ch);
switch(ch)
{
case 1:find(head);printf("\t\t\t\t\t");system("pause");break;
case 2:del(head);printf("\t\t\t\t\t");system("pause");break;
case 3:printf("\t\t\t\t\t");system("cls");
centre();
{
printf("\t 感谢你的使用!");
Sleep(2000);
}
system("cls");
exit(1);
default:printf("请输入有效数字!");
}
}
return 0;
}
void centre()
{
int t;
for(t=0;t<12;t++)
printf("\n");
printf("\t\t\t\t\t");
}