数据结构(C语言)求解答 求大侠解答程序含义,尽量讲解详细些,我是初学者

Python022

数据结构(C语言)求解答 求大侠解答程序含义,尽量讲解详细些,我是初学者,第1张

#include<stdio.h>

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

}