PTA作业-单链表C++

 1.题目:

 代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    struct node*next;
    }linklist;
linklist *CreatListR(int n){
    int i,m;
    linklist  *head,*s,*r;    
    head=(linklist*)malloc(sizeof(linklist));    
    r=head;    
    for(i=0;i<n;i++){                
    s=(linklist*)malloc(sizeof(linklist));        
    scanf("%d",&m);       
     s->data=m;       
      r->next=s;        
      r=s;                    }    
      r->next=NULL;    
      return head;}  
      int main(){    
      int n;   
      scanf("%d",&n);    
      if(n<=0) return 0;    
      linklist *s;    
      s=CreatListR(n);   
      s=s->next;    
      printf("%d",s->data);    
      while(s->next!=NULL){        
      s=s->next;        
      printf(" %d",s->data);
          }     
           return 0;
       }

#include<stdio.h>

#include<stdlib.h>

#include<stdio.h>表示一个头文件,包含了一些输入和输出的函数

#include<stdlib.h>表示一个头文件,提供了一系列的通用函数,如内存分配、随机数生成、程序终止等 

如下是一些其他的头文件。

#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <fstream.h>    //文件输入/输出
#include <iomanip.h>    //参数化输入/输出
#include <iostream.h>   //数据流输入/输出
#include <limits.h>    //定义各种数据类型最值常量
#include <locale.h>    //定义本地化函数
#include <math.h>     //定义数学函数
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <strstrea.h>   //基于数组的输入/输出
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类

接下来看下面的代码

typedef struct node{
    int data;
    struct node*next;
    }linklist;

  typedef 定义新类型:typede int Name    //typede 类型 别名(就是把int换了个名字变成Name)

#include <iostream>
using namespace std;

typedef int Name; //Name = int
int main()
{
Name a;//int a
a=100;
cout<<a<<endl;
}

结构体的注意事项:

结构类型 结构变量,是两个不一样的东西

int a=10;

struct student stu;

struct student stu={233,'boy'};
printf{"%d,%c",stu.ID,stu.name}; 

#include <stdio.h>

struct student{
int ID;
char name;

}


int main(){
int ID=666;
struct student stu={233,'boy'};
printf{"%d,%c",stu.ID,stu.name};
return 0;
}

struct student{
int ID;
char name;}

struct student stu

#include <stdio.h>

struct student{
int ID;
char name;

struct teacher{
in age
}th

}

}
int main(){
int ID=666;
struct student stu
stu.ID=233;
stu.name=boy;
stu.th.age=6
return 0;
}

 struct student{
int ID;
char name;
}stu

#include <stdio.h>

struct student{
int ID;
char name;
}stu

}
int main(){
int ID=666;

stu.ID=233;
stu.name=boy;
stu.th.age=6
return 0;
}

 typedef struct student{
int ID;
char name;
}stu

#include <stdio.h>

typedef struct student{
int ID;
char name;
}stu

}
int main(){
stu sst={22,'aa'};


return 0;
}

 结构体指针

stu sst={22,'aa'};
stu* pst=&sst;
pst->ID=66;

#include <stdio.h>

typedef struct student{
int ID;
char name;
}stu

}
int main(){
stu sst={22,'aa'};
stu* pst=&sst;
pst->ID=66;


return 0;
}

 结构体数组

#include <stdio.h>
struct student{
int ID;
char name;
}stu[10]

}
int main(){
stu[0].ID=1;
stu[0].name=a;
stu[0].ID=66;


return 0;
}

&:取地址运算符(用来获取变量的地址)

* :间接运算符(用来获取某地址对应的值)

int *ptr:变量类型 *变量名

int main{
int number=5;
int value=*(&number);
printf("%p",&number);//输出number地址
printf("%d",number);//5
printf("%d",value);//5
return 0;
}
int mian{
int number=5;
int *ptr=&number;//将ptr指向number,赋值number的地址

printf("%p",&number);//number的地址,number的地址
printf("%d",number);//number的值,5
printf("%p",&ptr);//ptr的地址,ptr的地址
printf("%p",ptr);//ptr的值,number的地址
printf("%d",*ptr);//ptr指向的变量的值,5

return 0;
}

 单链表

#include<stdio.h>
struct ListNode{
int val;
struct ListNode *next;
};

int main(){
struct ListNode a,b,c;
a.val=1;
b.val=2;
c.val=3;

a.next=&b;
b.next=&c;
c.next=NULL;

struct ListNode *head=&a;
while(head){
 printf("%d,%p,%p",head->val,head,head->next);
head=head->next;
 }
return 0;
}

while语句:

while(循环条件){
   循环语句; }

int i=1;
int sum=0;
while(i<=100)
{
sum+=i;
i++;
}
cout<<sum<<endl;
//计算1到100的所有和
int i=1;
int sum=0;
while(i<=100)
{
if(i==50)
break;//到这里就停止了,1到50

sum+=i;
i++;
}
cout<<sum<<endl;
int i=1;
int sum=0;
while(i<=100)
{
if(i==50)
continue;//死循环,不断的i=50

sum+=i;
i++;
}
cout<<sum<<endl;

函数指针与指针函数:()的优先级大于*

int *f(int x,int y);//指针函数,首先是一个函数,返回一个指针

int (*f)(int x,int y);//函数指针,首先f为一个指针,指向一个函数 

函数指针: 

int add(int x,int y){
return x+y;
}
int (*f)(int x,int y);
int main(){
f=&add;
printf("%d",(*f)(1,2));
return 1;
}

指针函数:

int c;
int* add(int x,int y){
 c=x+y;
return &c;
}

mallloc() 动态分配内存:好处是可以与free()一起使用提前释放内存,不需要等到程序运行结束后再释放内存。

# include <stdio.h>
# include <malloc.h>  
int main(void)
{
	int i = 5; //分配了4个字节 静态分配
	int * p = (int *)malloc(sizeof(4));//指针变量p为静态分配,malloc开辟的空间为动态分配,也可以用sizeof(int)交给系统判断申请的内存块长度,(int*)指明类型
	*p = 5; //*p 代表的就是一个int变量,指针变量p表示是一个以int类型的地址为内容的变量
	free(p); //freep(p)表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放
		//p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 
	return 0;
}

### JMU 数据结构 单链表逆置 PTA 题解 单链表的逆置可以通过多种方法实现,其中一种常见的方法是通过头插法来完成。这种方法的核心思想是在构建新链表的过程中,每次都将当前节点插入到新链表的头部,从而使得最终的新链表顺序与原链表相反。 以下是基于PTA平台可能涉及的单链表逆置操作的具体实现: #### 实现代码 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node* next; } LinkNode; // 初始化单链表 LinkNode* InitList() { LinkNode* L = (LinkNode*)malloc(sizeof(LinkNode)); L->next = NULL; return L; } // 尾插法建立单链表 void CreateListTail(LinkNode* L, int n) { LinkNode *p, *r = L; for(int i = 0; i < n; ++i){ p = (LinkNode*)malloc(sizeof(LinkNode)); scanf(" %c", &p->data); p->next = NULL; r->next = p; r = p; } } // 输出单链表 void PrintList(LinkNode* L) { LinkNode* p = L->next; while(p != NULL){ printf("%c ", p->data); p = p->next; } printf("\n"); } // 获取单链表长度 int GetLength(LinkNode* L) { int length = 0; LinkNode* p = L->next; while(p != NULL){ length++; p = p->next; } return length; } // 判断单链表是否为空 bool IsEmpty(LinkNode* L) { return L->next == NULL ? true : false; } // 查找指定位置的元素 char FindKthElement(LinkNode* L, int k) { LinkNode* p = L->next; int index = 1; while(p && index < k){ p = p->next; index++; } if(index == k && p) return p->data; else{ printf("Index out of range.\n"); exit(1); } } // 插入元素 void InsertElement(LinkNode* L, int pos, char value) { LinkNode* p = L; int index = 0; while(p && index < pos - 1){ p = p->next; index++; } if(!p || index >= pos - 1){ LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); newNode->data = value; newNode->next = p->next; p->next = newNode; }else{ printf("Invalid position to insert.\n"); exit(1); } } // 删除指定位置的元素 void DeleteElement(LinkNode* L, int pos) { LinkNode* p = L; int index = 0; while(p->next && index < pos - 1){ p = p->next; index++; } if(p->next){ LinkNode* q = p->next; p->next = q->next; free(q); }else{ printf("Invalid position to delete.\n"); exit(1); } } // 单链表逆置 void ReverseList(LinkNode* L) { LinkNode* prev = NULL; LinkNode* current = L->next; LinkNode* next_node = NULL; L->next = NULL; // 头结点指向NULL while(current != NULL){ next_node = current->next; current->next = prev; prev = current; current = next_node; } L->next = prev; // 新链表头指针赋给L->next } // 主函数演示 int main(){ int n; LinkNode* L = InitList(); printf("Enter the number of elements and then the characters:\n"); scanf("%d", &n); CreateListTail(L, n); printf("Original List: "); PrintList(L); ReverseList(L); printf("Reversed List: "); PrintList(L); return 0; } ``` 上述代码实现了单链表的基本功能,并提供了`ReverseList`函数用于执行链表的逆置操作[^3]。此函数利用迭代方式逐步调整每个节点的`next`指针方向,从而使整个链表反转。 #### 解决方案说明 - **初始化**:创建一个带头结点的空链表。 - **尾插法建表**:按照输入数据逐个插入到链表尾部。 - **打印链表**:遍历并输出链表中的所有元素。 - **获取长度**:统计链表中有效节点的数量。 - **判断是否为空**:检查链表是否有任何实际数据节点。 - **查找特定位置元素**:定位到目标索引处的节点并返回其值。 - **插入/删除元素**:分别支持在任意位置插入或删除节点的操作。 - **逆置链表**:通过改变各节点之间的连接关系实现整体倒序排列。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值