早教吧 育儿知识 作业答案 考试题库 百科 知识分享

求编程:构建一个链表,随机的存储十几个数字在链表里,并把这些数字打印出来。2、在上一题的基础上,把链表反转:例如:1->3->6->2->91

题目详情
求编程:
构建一个链表,随机的存储十几个数字在链表里,并把这些数字打印出来。
2、在上一题的基础上,把链表反转:
例如:
1 -> 3 -> 6 -> 2 -> 9
1 3、在“第一题”的基础上,快速得到倒数第5个元素的值。
▼优质解答
答案和解析
//为了练习,专门写的,希望满意
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h>
#include <conio.h>
typedef struct da
{
 int num;
 struct da *next;
}date;
date *create(void)
{
 date *head,*p=NULL,*p0;
 int m=0,i=0,N;
    p=(date *)malloc(sizeof(date));
 head=p;
 printf("请输入链表长度N:");
 scanf("%d",&N);
 srand((unsigned)time(NULL));
 m=rand()%100;
 p->num=m;
 for(i=1;i<N;i++)
 {
    m=rand()%100;
    p0=(date *)malloc(sizeof(date));
    p0->num=m;
    p->next=p0;
    p=p0;
 }
 p0->next=NULL;
 return head;
}
void output(date *head)
{
 date *p;
 p=head;
 while(p->next!=NULL)
 {
  printf("%-3d->  ",p->num);
  p=p->next;
 }
 printf("%-3d",p->num);
 printf("\n");
}
void save(date *head)
{
 FILE *fp;
 date *p;
 p=head;
 if((fp=fopen("test.txt","wt"))==NULL)
  {
   printf("error!");
   exit(0);
  }
 while(p!=NULL)
 {
  fprintf(fp,"%d ",p->num);
  p=p->next;
 }
 fclose(fp);
}
date *read(void)
{
 FILE *fp;
 date *p=NULL,*p1=NULL,*head;
 p1=(date *)malloc(sizeof(date));
 head=p1;
 if((fp=fopen("test.txt","rt"))==NULL)
 {
  printf("暂未录入任何信息!\n");
  exit(0);
 }
 while(feof(fp)==0)
 {
  p=(date *)malloc(sizeof(date));
  fscanf(fp,"%d",&p->num);
  if(feof(fp))
  {
   free(p);
   p1->next=NULL;
   break;
  }
  p1->next=p;
  p1=p;
 }
 fclose(fp);
 return head->next;
}
date *back(date *head)
{
 date *first=NULL,*tail,*p0,*p=head,*p1;
 while(p!=NULL)
 {
  for(p=head,p0=head;p->next!=NULL;p=p->next)
  {
   p1=p;
   p0=p->next;
  }
  if(first==NULL)
   {
    first=p0;
    tail=p0;
   }
  else 
  {
   tail->next=p0;
   tail=p0;
  }
   if(p0!=head)
   p1->next=NULL;
   else p=NULL;
 }
 tail->next=NULL;
 return first;
}
void five(date *head)
{
 int i=0,k=0;
 date *p=head,*q=head;
 output(p);
 while(p!=NULL)
  {
   p=p->next;
   i++;
  }
 printf("链表长度为%d\n",i);
 if(i<5)
  printf("不存在倒数第5个数字!\n");
 else
  for(k=5;k<i;k++)
   q=q->next;
 printf("其中倒数第5个数字为%d\n",q->num);
}
int main() 

 date *p=NULL,*q=NULL;
 int i=10;
 p=read();
 while(i)
 { 
  printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  printf("\t1 重新随机数字\n");
  printf("\t2 查看内容    \n");
  printf("\t3 反向输出    \n");
  printf("\t4 第五个数字  \n");
  printf("\t0 退    出    \n");
  printf("\t  请 选 择       \n");
  printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  scanf("%d",&i);  
  switch(i)
  {
   case 1:p=create();output(p);break;
   case 2:output(p);break;
   case 3:p=back(p);printf("反向输入结果为:\n");output(p);break;
   case 4:five(p);break;
   case 0:break;
   default:printf("输入有误 重新输入!\n");break;
  }
 printf("按任意键继续!...");
 getch();
 system("cls");
 }
 save(p); 
}
看了 求编程:构建一个链表,随机的...的网友还看了以下: