typedef struct node{
int data
struct node *next}Lnode
Lnode *create(int tag)//创建链表, tag作为创建结束标志,是你要传入的数值
{ Lnode *p,*h=NULL
int x
printf("input x:")
scanf("%d",&x)
while(x!=tag) //如果x 不等于tab就为节点分配内存
{ p=(Lnode*)malloc(sizeof(Lnode))//为节点分配内存
p->data=x //将x放入到节点中
p->next=h//指向下一个节点,第一次创建h为空,此时正好作为链表结束的标志。此后,这
//将表示在头结点次插入节点。
h=p//将新的节点p作为第一个节点
scanf("%d",&x)//再次输入要插入节点的值
}
return h
}
void printd(Lnode *h)//这个是打印链表的值,输入的参数是第一个节点
{ while(h)
{printf("%d ",h->data)
h=h->next
}
}
Lnode *revelist(Lnode *h)//将链表逆序,传入的参数为链表的第一个节点
{ Lnode *p,*q=NULL
while(h)
{p=h->next
h->next=q
q=h
h=p}
return q
}
void main()
{Lnode *ha,*hb
int tag
printf("\n input endtag=")
scanf("%d",&tag)//输入创建键表的结束标志
ha=create(tag)//创建链表
printf("This list is:\n")
printd(ha)//打印链表
ha=revelist(ha)//对链表作逆序处理
printf("\nrevelist is:\n")
printd(ha)//再次打印链表
getch()
}
方法很多,可以在插入数据后再对线性表进行删改,也可以在插入前进行处理。
我这里代码是在插入前处理。
(注释掉的函数int getPNUM(struct Sqlist *st,int n)是我预留的,题2如果你想改成插入后,再对线性表素数进行查找,可以用这个函数。否则可以删除)。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LIST_INIT_SIZE 800
struct Sqlist{
int *elem
int length
int listsize
}
int insert2List(struct Sqlist *st,int num,int inx)//向线性表第inx个元素的位置插入一个元素。成功返回1,失败返回0
int findNum(struct Sqlist *st,int num)//在线性表中查找指定数字,存在返回1,不存在返回0
//int getPNUM(struct Sqlist *st,int n)//查找素数,返回第几n个素数的下标。未找到返回-1
void showList(struct Sqlist *st)//打印线性表
void clearList(struct Sqlist *st)//清空线性表
int main()
{
int i,k,nums[LIST_INIT_SIZE],n,num,cnt,flag
struct Sqlist st={nums,0,LIST_INIT_SIZE}
srand(time(NULL))
//--------------题1-----------------------------------------------------------------------
n=100
k=1
printf("1、随机生成100个【100,200】之间的随机数,去除重复并保存到线性表\n")
while(n--)
{
num=rand()%101+100
printf("--%3d产生随机数%d\n",k++,num)
if(findNum(&st,num))
printf("该数字已在线性表中存在,重复去除\n")
else
{
if(insert2List(&st,num,st.length+1))
printf("该随机值已保存到线性表尾部\n")
else{
printf("异常!插入失败!\n")
return 1
}
}
}
showList(&st)
clearList(&st)
//-------------题2----------------------------------------------------------------
n=20
cnt=0
k=1
printf("1、随机生成20个【1,200】之间的随机数,在第一个素数后插入1个0,第二个素数后插入2个0,以此类推,最后输出所有元素\n")
while(n--)
{
num=rand()%200+1
printf("--%3d产生随机数%d\n",k++,num)
flag=1
for(i=2i<numi++)
if(num%i==0)
{
flag=0
break
}
if(flag)
{
cnt++
printf("该随机值是一个素数,在其尾部插入%d个0\n",cnt)
for(i=0i<cnti++)
num*=10
printf("该随机值变更为%d\n",num)
}
if(insert2List(&st,num,st.length+1))
printf("该随机值已保存到线性表尾部\n")
else{
printf("异常!插入失败!\n")
return 1
}
}
showList(&st)
return 0
}
void clearList(struct Sqlist *st)//清空线性表
{
st->length=0
printf("线性表数据已清除\n")
}
void showList(struct Sqlist *st)//打印线性表
{
int i
printf("当前线性表的数据为:\n")
for(i=0i<st->lengthi++)
printf("%d ",st->elem[i])
printf("\n")
}
int findNum(struct Sqlist *st,int num)//在线性表中查找指定数字,存在返回1,不存在返回0
{
int *p=st->elem
while(p<=&st->elem[st->length-1])
if(*p++==num)
return 1
return 0
}
/*
int getPNUM(struct Sqlist *st,int n)//查找素数,返回第几n个素数的下标。未找到返回-1
{
int i,j,flag,cnt=0
for(i=0i<st->lengthi++)
{
flag=1
for(j=2j<st->elem[i]j++)
if(st->elem[i]%j==0)
{
flag=0
break
}
if(flag)
cnt++
if(cnt==n)
return i
}
return -1
}
*/
int insert2List(struct Sqlist *st,int num,int inx)//向线性表第inx个元素的位置插入一个元素。成功返回1,失败返回0
{
int i
if(st->length==st->listsize)
{
printf("线性表已满,插入失败!\n")
return 0
}
if(inx<1 &&inx>st->length+1)
{
printf("插入位置无效!线性表当前数据长度为%d,插入位置必须大于1且不能大于%d!\n",st->length,st->length+1)
return 0
}
for(i=st->lengthi>=inxi--)
st->elem[i]=st->elem[i-1]
st->elem[inx-1]=num
st->length++
return 1
}