Day 12
实验三
1.int fun(vector <float>&s,int n){//传单个 vector<float>
2.
stu *a=new stu[n];//不支持传引用
3.//固定数组的引用
//const int MAX_STU = 50;
//void shuchu(stu (&a)[MAX_STU], int n)
3.单项链表(普通版)
#include<iostream>
using namespace std;
struct node{
int num;
node*next;
// 构造函数,简化结点初始化
// node(int n = 0, node* p = NULL) : num(n), next(p) {}
};
int main(){
node a[100],head,*p;
int i(0),shu;
head.next=NULL;
node *tail=&head;//尾指针挂载
while(cin>>shu&&shu!=0){
a[i].num=shu;
tail->next=&a[i];
tail=&a[i];
i++;
}
tail->next=NULL;
cout<<"The data of link:"<<endl;
p=head.next;
while(p!=NULL){
cout<<p->num<<" ";
p=p->next;
}
return 0;
}
4.链表操作
输入若干个正整数(输入-1为结束标志),建立一个单向链表,将其中的偶数值结点删除后输出。
//nullptr 是 C++11 新增的关键字,专门用于表示 “空指针
//NULL 宏定义,本质是整数 0(或 0L)
#include<iostream>
using namespace std;
struct Node {
int data;
struct Node *next;
};
Node* createList() {
Node* head = new Node();
head->next = nullptr;
Node* tail = head;
int num;
while (cin >> num && num != -1) {
if (num > 0) {
Node* newNode = new Node();
newNode->data = num;
newNode->next = nullptr;
tail->next = newNode;
tail = newNode;
}
}
return head;
}
// 删除链表中的偶数结点
void deleteEvenNodes(Node* head) {
Node* pre = head; // 前驱结点(指向待判断结点的前一个结点)
Node* cur = head->next; // 当前结点(遍历链表)
while (cur != nullptr) {
if (cur->data % 2 == 0) { // 偶数结点,执行删除
pre->next = cur->next; // 前驱结点跳过当前偶数结点
delete cur; // 释放偶数结点内存
cur = pre->next; // 当前结点后移(无需移动前驱)
} else { // 奇数结点,前驱和当前结点均后移
pre = cur;
cur = cur->next;
}
}
}
// 遍历输出链表(格式:结点值间加空格,无前置/后置空格)
void printList(Node* head) {
Node* p = head->next;
bool isFirst = true; // 标记第一个有效结点,控制空格
while (p != nullptr) {
if (!isFirst) {
cout << " ";
}
cout << p->data;
isFirst = false;
p = p->next;
}
cout << endl;
}
// 释放链表内存(避免内存泄漏)
void freeList(Node* head) {
Node* p = head;
while (p != nullptr) {
Node* temp = p;
p = p->next;
delete temp;
}
}
int main() {
Node* head = createList();
deleteEvenNodes(head);
printList(head);
freeList(head);
return 0;
}
