1、随机产生n个100以内整数生成一个链式存储的单链表, 并实现如下功能(用菜单实现):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}linklist;
void main()
{
linklist *head;
linklist *p;
int i;
int data,location;
void menu();
void OUT(linklist *head);
linklist* CREATE_R(int n);
void Insert(linklist *p,int e);
void LOCATE(linklist *head,int i);
void DELETE_AFTER(linklist *p);
linklist *GET(linklist *head,int i);
head = CREATE_R(10);
OUT(head);
do
{
menu();
OUT(head);
scanf("%d",&i);
switch(i)
{
case 1:
printf("请输入要插入的数据!\n");
scanf("%d",&data);
printf("请输入要插入的位置!\n");
scanf("%d",&location);
p=GET(head,location-1);
if(p)
{
Insert(p,data);
OUT(head);
}
else
{
printf("位置错误!");
}
break;
case 2:
printf("请输入要删除的位置!\n");
scanf("%d",&location);
p=GET(head,location-1);
if(p!=NULL)
{
DELETE_AFTER(p);
OUT(head);
}
else
{
printf("位置错误!\n");
}
break;
case 3:
printf("请输入要查询的位置!\n");
scanf("%d",&location);
LOCATE(head,location);
break;
case 4:
printf("\t\t\t________________________\n\n");
printf("\t\t\t Thank you \n");
printf("\t\t\t________________________\n\n");
exit(0);
default:
printf("ERROR!/n");
}
getchar();
getchar();
}while(i!=4);
}
//生成一个长度为100,随机链表
//尾插法建表
linklist* CREATE_R(int n)
{
int i;
linklist *head,*r;
head = (linklist*)malloc(sizeof(linklist));
head->next=NULL;
r = head;
for(i=1;i<=n;i++)
{
linklist *s;
s = (linklist*)malloc(sizeof(linklist));
s->data = rand()%1000;
//scanf("%d",&s->data);
s->next = NULL;
r->next = s;
r = r->next;
}
printf("Create a linklist successfully!\n");
return head;
}
void menu()
{
system("cls");
printf("\t\t\t________________________\n\n");
printf("\t\t\t menu \n");
printf("\t\t\t________________________\n\n");
printf("\t\t\t1.Insert \n");
printf("\t\t\t2.Delete \n");
printf("\t\t\t3.Locate \n");
printf("\t\t\t4.Exit \n");
printf("\t\t\t________________________\n");
}
//打印链表
void OUT(linklist *head)
{
linklist *p;
p = head->next;//指向第一个结点
while(p)
{
printf("%6d",p->data);
p = p->next;
}
printf("\n");
}
//后插法插入数据
void Insert(linklist *p,int e)
{
linklist *s;
s=(linklist*)malloc(sizeof(linklist));
s->data=e;
s->next=p->next;
p->next=s;
}
linklist *GET(linklist *head,int i)
{
linklist *p;
int j=0;
p=head;
while((p->next!=NULL) && (j<i))
{
p=p->next;
j++;
}
if(i==j)
return p;
else
return NULL;
}
void LOCATE(linklist *head,int i)
{
linklist *p,*q;
int j;
p = head;
j = 0;
if(i==1)
{
printf("第一个数据为%d\n",p->next->data);
printf("此结点没有前趋!\n");
printf("此结点的后继元素为%d!\n",p->next->next->data);
}
else
{
while((p->next)!=NULL && j<i)
{
q = p;
p = p->next;
j++;
}
if(i==j)
{
if(p->next == NULL)
{
printf("第%d个数据为%d\n",i,p->data);
printf("此结点的前趋元素为%d!\n",q->data);
printf("此结点没有后继!\n");
}
else
{
printf("第%d个数据为%d\n",i,p->data);
printf("此结点的前趋元素为%d!\n",q->data);
printf("此结点的后继元素为%d!\n",p->next->data);
}
}
else
{
printf("Error!");
}
}
}
void DELETE_AFTER(linklist *p)
{
linklist *r;
r=p->next;
p->next=r->next;
free(r);
}