首页 > 其他分享 >9.16日pta练习

9.16日pta练习

时间:2023-09-16 20:11:26浏览次数:35  
标签:return struct header 9.16 练习 pta next int LinkNode

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:

输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。

输出格式:

输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。

这一段代码是根据书上完成的,可以通过测试

  1 #include<iostream>
  2 #include<iomanip>
  3 #include<stdlib.h>
  4 using namespace std;
  5 typedef int ElemType;
  6 typedef int Status;
  7 #define ERROR 0
  8 #define OK 1
  9 #define OVERFLOW 3
 10 
 11 typedef struct LNode
 12 {
 13     ElemType data;
 14     struct LNode *next;
 15 }LNode ,*LinkList;
 16 
 17 Status ListInsert(LinkList L,int i,ElemType e)
 18 {
 19     int j=0;
 20     LinkList p=L,s;
 21     while(p&&j<i-1) // 寻找第i-1个结点
 22     {
 23         p=p->next;
 24         j++;
 25     }
 26     if(!p||j>i-1) // i小于1或者大于表长
 27         return ERROR;
 28     s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
 29     s->data=e; // 插入L中
 30     s->next=p->next;
 31     p->next=s;
 32     return OK;
 33  }
 34 
 35  Status ListDelete(LinkList L,int i)
 36  {
 37    int j=0;
 38    LinkList p=L,q;
 39    while(p->next&&j<i-1) // 寻找第i个结点,并令p指向其前趋
 40    {
 41      p=p->next;
 42      j++;
 43    }
 44    if(!p->next||j>i-1) // 删除位置不合理
 45      return ERROR;
 46    q=p->next; // 删除并释放结点
 47    p->next=q->next;
 48    free(q);
 49    return OK;
 50  }
 51 
 52  int main()
 53  {
 54      ios::sync_with_stdio(false);
 55      cin.tie(0);
 56      cout.tie(0);
 57      LinkList L;
 58      L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
 59      if(!L) // 存储分配失败
 60         exit(OVERFLOW);
 61      L->next=NULL;
 62 
 63      int n=0,m=0;
 64      LinkList db=L,da;
 65      cin>>n;
 66      for(int i=0;i<n;i++)
 67      {
 68          da=(LinkList)malloc(sizeof(LNode));
 69          cin>>da->data;
 70          da->next=NULL;
 71          db->next=da;
 72          db = da;
 73      }
 74      cin>>m;
 75      for(int i=0;i<m;i++)
 76      {
 77          int o,x,y;
 78          cin>>o;
 79          if(o==0)
 80          {
 81              cin>>x>>y;
 82              ListInsert(L,x+1,y);
 83          }
 84          else if(o==1)
 85          {
 86              cin>>x;
 87              ListDelete(L,x);
 88          }
 89          else
 90          {
 91              exit(ERROR);
 92          }
 93      }
 94 
 95      LinkList p=L->next;
 96      while(p!=NULL)
 97      {
 98          cout<<p->data<<" ";
 99          p = p->next;
100      }
101 
102      return 0;
103  }

不过我自己根据网上的单链表的学习,写了一下程序,发现通过不了,显示段错误和运行超时,不知道为什么,希望大神可以指出来

  1 #include <iostream>
  2 #include <stdlib.h>
  3 using namespace std;
  4 typedef struct LinkNode{
  5     int data;
  6     struct LinkNode* next;
  7 }LinkNode;
  8 struct LinkNode* InputData(){
  9     struct LinkNode* header = (struct LinkNode*)malloc(sizeof(struct LinkNode));
 10     header->data=-1;
 11     header->next=NULL;
 12     struct LinkNode* ptail=header;
 13     int n;
 14     cin>>n;
 15     for(int i=0;i<n;i++){
 16         int number;
 17         struct LinkNode* newNode=(struct LinkNode*)malloc(sizeof(struct LinkNode));
 18         cin>>number;
 19         newNode->data=number;
 20         newNode->next=NULL;
 21         ptail->next=newNode;
 22         ptail=newNode;
 23     }
 24     return header;
 25 }
 26 void Insert (struct LinkNode* header,int k,int d){
 27     if(header==NULL){
 28         return;
 29     }
 30     int count=0;
 31     struct LinkNode* ptail =header->next;
 32     while(ptail!=NULL){
 33         count++;
 34         ptail=ptail->next;
 35     }
 36     if(k>count){
 37         return;
 38     }
 39     struct LinkNode* pfrount =header;
 40     struct LinkNode* pcurrent = header->next;
 41     for(int i=0;i<k;i++){
 42         pfrount=pcurrent;
 43         pcurrent=pcurrent->next;
 44     }
 45     if(pfrount==NULL){
 46         return;
 47     }
 48     struct LinkNode* newNode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
 49     newNode->data=d;
 50     newNode->next=NULL;
 51     newNode->next=pcurrent;
 52     pfrount->next=newNode;
 53 }
 54 void DeleteNode(struct LinkNode* header,int k){
 55     if(header==NULL){
 56         return;
 57     }
 58     if(k==0){
 59         return;
 60     }
 61     struct LinkNode* pfront =header;
 62     struct LinkNode* pcurrent=header->next;
 63     for(int i=0;i<k-1;i++){
 64         pfront=pcurrent;
 65         pcurrent=pcurrent->next;
 66     }
 67     pfront->next=pcurrent->next;
 68 }
 69 void  Foreach_LinkNode(struct LinkNode* Header)
 70 {
 71     if (Header == NULL)
 72         return;
 73     struct LinkNode* Pcurrent = Header->next;            //Pcurrent 现在的指针
 74     while (Pcurrent != NULL)                            //判断现在里面的值是否为空
 75     {
 76         printf("%d  ", Pcurrent->data);                   //打印现在结构体存储的值
 77         Pcurrent = Pcurrent->next;                      //将现在的指针往下一个点偏移。
 78     }
 79 }
 80 
 81 int main(){
 82     struct LinkNode* header=InputData();
 83     int n;
 84     cin>>n;
 85     int number;
 86     for(int i=0;i<n;i++){
 87         int number;
 88         cin>>number;
 89         if(number==0){
 90             int a,b;
 91             cin>>a>>b; 
 92             Insert(header,a,b);
 93         }
 94         else if(number==1){
 95             int c;
 96             cin>>c;
 97             DeleteNode(header,c);
 98         }
 99     }
100     Foreach_LinkNode(header); 
101 }

 

标签:return,struct,header,9.16,练习,pta,next,int,LinkNode
From: https://www.cnblogs.com/Lyh3012648079/p/17707239.html

相关文章

  • 【2023潇湘夜雨】WIN11_Pro_23H2.22631.2338软件选装纯净版9.16
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22631.2338。2.增加部分优化方案,手工精简部分较多。3.OS版本号为22631.2338。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.13.0.8》网卡版、......
  • 23.9.16(Java版登录界面)
    //Anadditionprogramimportjavax.swing.JOptionPane;//importclassJOptionPaneimportjavax.swing.*;importjava.awt.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.image.BufferedImage;importjava.util.Random;pub......
  • 关于pta上6-2 两个有序链表序列的合并
    这是在dev上的源代码,C语言#include<stdio.h>#include<stdlib.h>typedefintElementType;typedefstructNode*PtrToNode;structNode{ElementTypeData;PtrToNodeNext;};typedefPtrToNodeList;ListRead();/*细节在此不表*/voidPrint(List......
  • 练习:经典问题--n 以内的质数
    题:请找出n以内的所有质数(不包括n)。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数如,n=100输出:[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]1classSolution(object):2deffunc(self,n):......
  • 9.16 英语精读
    9.16精读国货 GlobalconsumerbrandsgrapplingwithatepideconomicrecoveryinChinahaveanotherworry:Buyersinthecountryareturningmoretolocallabels.Asrecentlyasfiveyearsago,China'sconsumermarketwasdominatedbyforeignbran......
  • 9.16
    课堂测试重写publicclassWarehouseInformation{privateStringitemno;privateStringitemname;privateStringsuppliername;privateStringwarehousingtime;privateStringshipmenttime;privateStringwarehous......
  • 尚硅谷大数据HiveSQL练习题(一)——同时在线人数问题
    题目需求现有各直播间的用户访问记录表(live_events)如下,表中每行数据表达的信息为,一个用户何时进入了一个直播间,又在何时离开了该直播间。user_id(用户id)live_id(直播间id)in_datetime(进入直播间的时间)out_datetime(离开直播间的时间)10012021-12-119:30:00......
  • 课堂练习题整理
    实验:枚举值的foreach迭代总结:已大致了解枚举类(enum)的用法。1.toString():返回当前枚举类对象常量的名称。拿到枚举对象,直接打印输入此对象的信息而不是一个地址2.values():返回枚举类型的对象数组,该方法可以方便的遍历所有的枚举名称3.valuesOf(Stringstr):可以把一个字符串转......
  • 课后练习
    packagea1;publicclassTest{privatestaticinta=1;publicstaticvoidmain(String[]args){inta=2;System.out.println(a);}}'''Java变量遵循同名变量屏蔽原则publicstaticvoidmain(Stringargs[]){System.out.println("0.0......
  • 课程动手动脑练习
    publicclassMain{privateenumMyEnum{ONE,TWO,THREE}publicstaticvoidmain(String[]args){for(MyEnumvalue:MyEnum.values()){System.out.println(value);}}}运行结果为,ONETWOTHREE结构:enum名称{数据......