链表,不用类

#include<iostream>
#define ok 0
#define error -1
using namespace std;
int num ;


struct ListNode {
	int data;
	ListNode*next;
};

void LL_display(ListNode*head) {
	ListNode *p = head->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
ListNode* LL_index(ListNode*head,int i) {
	if (i > num || i < 1) {
		return NULL;
	}
	int j = 1;
	for (ListNode*pG = head->next; pG->next, j <= i; pG = pG->next, j++) {
		if (j == i) {
			return pG;
		}
	}
}

int LL_get(ListNode*head,int i) {
	if (i > num || i < 1) {
		return error;
	}
	ListNode*num = LL_index(head,i);
	if (num == NULL)
		return error;
	else
		return num->data;
}

int LL_insert(ListNode*head,int i, int item) {
	if (i < 1 || i> num + 1)
		return error;
	ListNode*pI = new ListNode;
	if (!head->next&&i == 1) {
		head->next = pI;
		pI->data = item;
		pI->next = NULL;
		num++;
		return ok;
	}
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return error;
	ListNode*pU = new ListNode;
	pU->next = pG->next;
	pG->next = pU;
	pU->data = item;
	num++;
	return ok;
}
int LL_del(ListNode*head,int i) {
	if (i > num || i<1)
		return error;
	ListNode*pI = new ListNode;
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return error;
	pI = pG->next;
	pG->next = pI->next;
	delete pI;
	num--;
	return ok;
}

int main() {
	ListNode*sa = new ListNode;//不 new 的话不会分配内存
	sa->data = -1;
	sa->next=NULL;
	num = 0;
	int len;
	cin >> len;
	int number;
	for (int i = 0; i < len; i++) {
		cin >> number;
		LL_insert(sa,i + 1, number);
	}
	LL_display(sa);

	int i, item, k;

	cin >> i >> item;
	k = LL_insert(sa,i, item);
	if (k == 0)
		LL_display(sa);
	else
		cout << "error" << endl;

	cin >> i >> item;
	k = LL_insert(sa,i, item);
	if (k == 0)
		LL_display(sa);
	else
		cout << "error" << endl;

	cin >> i;
	k = LL_del(sa,i);
	if (k == 0)
		LL_display(sa);
	else
		cout << "error" << endl;

	cin >> i;
	k = LL_del(sa,i);
	if (k == 0)
		LL_display(sa);
	else
		cout << "error" << endl;

	cin >> i;
	k = LL_get(sa,i);
	if (k == -1)
		cout << "error" << endl;
	else
		cout << k << endl;

	cin >> i;
	k = LL_get(sa, i);
	if (k == -1)
		cout << "error" << endl;
	else
		cout << k << endl;

	return 0;
}

 

 

 

 

循环链表:

#include<iostream>
using namespace std;
int num;


struct ListNode {
	int data;
	ListNode*next;
};

void display(ListNode*head) {
	ListNode *p = head->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
ListNode* index(ListNode*head, int i) {
	int j = 1;
	for (ListNode*pG = head->next; pG->next, j <= i; pG = pG->next, j++) {
		if (j == i) {
			return pG;
		}
	}
}

int get(ListNode*head, int i) {
	ListNode*n = index(head, i);
	if (n == NULL)
		return 0;
	else
		return n->data;
}

int insert(ListNode*head, int i, int item) {
	ListNode*pI = new ListNode;
	if (!head->next&&i == 1) {
		head->next = pI;
		pI->data = item;
		pI->next = NULL;
		num++;
		return 1;
	}
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	ListNode*pU = new ListNode;
	pU->next = pG->next;
	pG->next = pU;
	pU->data = item;
	num++;
	return 1;
}
int del(ListNode*head, int i) {
	ListNode*pI = new ListNode;
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	pI = pG->next;
	pG->next = pI->next;
	delete pI;
	num--;
	return 1;
}

int onlyOne(ListNode*head) {
	if (head->next == head) {
		return 1;
	}
	else {
		return 0;
	}
}

int main() {
	int len;//人数
	while (scanf("%d", &len) == 1) {
		ListNode*sa = new ListNode;//不 new 的话不会分配内存
		sa->data = -1;
		sa->next = NULL;
		num = 0;
		int number;
		for (int i = 0; i < len; i++) {
			scanf("%d", &number);//输入每个人持有的密码
			insert(sa, i + 1, number);
		}//通过for循环一个一个连入链表
		ListNode* p1 = index(sa, len);
		ListNode* p2 = index(sa, len - 1);
		sa->data = p1->data;
		p2->next = sa;//首尾连接构成环链
		int m;
		int key;
		scanf("%d", &m);
		ListNode*start = sa;
		while (!onlyOne(start)) {
			ListNode*p = index(start, m);
			key = p->data;
			ListNode*q = index(start, m - 1);
			del(start, m);
			start = q;
			//循环链表可能转几圈遍历所有,这样删掉的元素被 跳过,造成混乱 
			m = key;
			printf("%d ", key);
		}
		printf("%d\n", start->data);
	}
	return 0;
}

现在的问题是,循环终止条件,只有单个元素的环形链表的判断

#include<iostream>
using namespace std;
int num;


struct ListNode {
	int data;
	ListNode*next;
};

void display(ListNode*head) {
	ListNode *p = head->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}
ListNode* index(ListNode*head, int i) {
	if (i == 0) {
		return head;
	}
	int j = 1;
	for (ListNode*pG = head->next; pG->next, j <= i; pG = pG->next, j++) {
		if (j == i) {
			return pG;
		}
	}
}

int get(ListNode*head, int i) {
	ListNode*n = index(head, i);
	if (n == NULL)
		return 0;
	else
		return n->data;
}

int insert(ListNode*head, int i, int item) {
	ListNode*pI = new ListNode;
	if (!head->next&&i == 1) {
		head->next = pI;
		pI->data = item;
		pI->next = NULL;
		num++;
		return 1;
	}
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	ListNode*pU = new ListNode;
	pU->next = pG->next;
	pG->next = pU;
	pU->data = item;
	num++;
	return 1;
}
int del(ListNode*head, int i) {
	ListNode*pI = new ListNode;
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	pI = pG->next;
	pG->next = pI->next;
	delete pI;
	num--;
	return 1;
}

int onlyOne(ListNode*head) {
	if (head->next == head) {
		return 1;
	}
	else {
		return 0;
	}
}

int main() {
	int len;//人数
	while (scanf("%d", &len) == 1) {
		ListNode*sa = new ListNode;//不 new 的话不会分配内存
		sa->data = -1;
		sa->next = NULL;
		num = 0;
		int number;
		for (int i = 0; i < len; i++) {
			scanf("%d", &number);//输入每个人持有的密码
			insert(sa, i + 1, number);
		}//通过for循环一个一个连入链表
		ListNode* p1 = index(sa, len);
		ListNode* p2 = index(sa, len - 1);
		sa->data = p1->data;
		p2->next = sa;//首尾连接构成环链
		int m;
		int key;
		scanf("%d", &m);
		ListNode*start = sa;
		while (!onlyOne(start)) {
			ListNode*p = index(start, m);
			key = p->data;
			ListNode*q = index(start, m - 1);
			del(start, m);
			start = q;
			//循环链表可能转几圈遍历所有,这样删掉的元素被 跳过,造成混乱 
			m = key;
			printf("%d ", key);
		}
		printf("%d\n", start->data);
	}
	return 0;
}

成功,对 i = 0 ,的查找没有修改。属于细节地方出问题,要善于运用debug。

精简和注释

 

#include<stdio.h>

//定义结构体
struct ListNode {
	int data;
	ListNode*next;
};

//查找:返回链表中第i个元素的地址
ListNode* index(ListNode*head, int i) {
	if (i == 0) {
		return head;
	}
	int j = 1;
	for (ListNode*pG = head->next; pG->next, j <= i; pG = pG->next, j++) {
		if (j == i) {
			return pG;
		}
	}
}

//插入:在i位置插入元素
int insert(ListNode*head, int i, int item) {
	ListNode*pI = new ListNode;
	if (!head->next&&i == 1) {
		head->next = pI;
		pI->data = item;
		pI->next = NULL;
		return 1;
	}
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	ListNode*pU = new ListNode;
	pU->next = pG->next;
	pG->next = pU;
	pU->data = item;
	return 1;
}


//删除:删除i处元素
int del(ListNode*head, int i) {
	ListNode*pI = new ListNode;
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	pI = pG->next;
	pG->next = pI->next;
	delete pI;
	return 1;
}

//判断环链表是否只剩一下一个元素
int onlyOne(ListNode*head) {
	if (head->next == head) {
		return 1;
	}
	else {
		return 0;
	}
}

int main() {
	int len;//人数

	//用while() 实现多组输入
	while (scanf("%d", &len) == 1) {
		//创建单向链表
		ListNode*sa = new ListNode;
		sa->data = -1;
		sa->next = NULL;
		int number;
		for (int i = 0; i < len; i++) {
			scanf("%d", &number);
			insert(sa, i + 1, number);
		}
		//构成环链表
		ListNode* p1 = index(sa, len);
		ListNode* p2 = index(sa, len - 1);
		sa->data = p1->data;
		p2->next = sa;
		//输入第一个报数值
		int m;
		int key;
		scanf("%d", &m);
		ListNode*start = sa;
		//依次报数并出列
		while (!onlyOne(start)) {
			ListNode*p = index(start, m);
			key = p->data;
			ListNode*q = index(start, m - 1);
			del(start, m);
			start = q;
			m = key;
			printf("%d ", key);
		}
		printf("%d\n", start->data);
	}
	return 0;
}

 

 

多项式:

#include<stdio.h>

struct list{
	int coef;
	int power;
	list* next;
};


/*void display(ListNode*head) {
	ListNode *p = head->next;
	while (p != NULL) {
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}*/
ListNode* index(ListNode*head, int i) {
	if (i == 0) {
		return head;
	}
	int j = 1;
	for (ListNode*pG = head->next; pG->next, j <= i; pG = pG->next, j++) {
		if (j == i) {
			return pG;
		}
	}
}
 
int get(ListNode*head, int i) {
	ListNode*n = index(head, i);
	if (n == NULL)
		return 0;
	else
		return n->data;
}
 
int insert(ListNode*head, int i, int item) {
	ListNode*pI = new ListNode;
	if (!head->next&&i == 1) {
		head->next = pI;
		pI->data = item;
		pI->next = NULL;
		num++;
		return 1;
	}
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	ListNode*pU = new ListNode;
	pU->next = pG->next;
	pG->next = pU;
	pU->data = item;
	num++;
	return 1;
}
int del(ListNode*head, int i) {
	ListNode*pI = new ListNode;
	int j = 0;
	ListNode*pG = head;
	while (pG->next&&j < i - 1) {
		pG = pG->next;
		j++;
	}
	if (!pG || j > i - 1)
		return 0;
	pI = pG->next;
	pG->next = pI->next;
	delete pI;
	num--;
	return 1;
}



int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
	}
	
	
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园2.0是高校信息化建设的新阶段,它面对着外部环境变化和内生动力的双重影响。国家战略要求和信息技术的快速发展,如云计算、大数据、物联网等,为智慧校园建设提供了机遇,同时也带来了挑战。智慧校园2.0强调以服务至上的办学理念,推动了教育模式的创新,并对传统人才培养模式产生了重大影响。 智慧校园建设的解决之道是构建一个开放、共享的信息化生态系统,利用互联网思维,打造柔性灵活的基础设施和强大的基础服务能力。这种生态系统支持快速迭代的开发和持续运营交付能力,同时注重用户体验,推动服务创新和管理变革。智慧校园的核心思想是“大平台+微应用+开放生态”,通过解耦、重构和统一运维监控,实现服务复用和深度融合,促进业务的快速迭代和自我演化。 智慧校园的总体框架包括多端协同,即“端”,它强调以人为中心,全面感知和捕获行为数据。这涉及到智能感知设备、超级APP、校园融合门户等,实现一“码”或“脸”通行,提供线上线下服务端的无缝连接。此外,中台战略是智慧校园建设的关键,包括业务中台和数据中台,它们支持教育资源域、教学服务域等多个领域,实现业务的深度融合和数据的全面治理。 在技术层面,智慧校园的建设需要分期进行,逐步解耦应用,优先发展轻量级应用,并逐步覆盖更多业务场景。技术升级路径包括业务数据化、数据业务化、校园设施智联化等,利用IoT/5G等技术实现设备的泛在互联,并通过人工智能与物联网技术的结合,建设智联网。这将有助于实现线上线下一网通办,提升校园安全和学习生活体验,同时支持人才培养改革和后勤管理的精细化。 智慧校园的建设不仅仅是技术的升级,更是对教育模式和管理方式的全面革新。通过构建开放、共享的信息化生态系统,智慧校园能够更好地适应快速变化的教育需求,提供更加个性化和高效的服务,推动教育创新和人才培养的高质量发展。
以下是一个简单的链表模板,不使用来实现: ```cpp #include <iostream> struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* createList(int arr[], int n) { if (n == 0) { return nullptr; } ListNode* head = new ListNode(arr[0]); ListNode* cur = head; for (int i = 1; i < n; i++) { cur->next = new ListNode(arr[i]); cur = cur->next; } return head; } void printList(ListNode* head) { ListNode* cur = head; while (cur != nullptr) { std::cout << cur->val << " "; cur = cur->next; } std::cout << std::endl; } void deleteList(ListNode* head) { while (head != nullptr) { ListNode* next = head->next; delete head; head = next; } } int main() { int arr[] = {1, 2, 3, 4, 5}; ListNode* head = createList(arr, 5); printList(head); deleteList(head); return 0; } ``` 该模板包含三个函数: - `createList`:根据输入数组创建链表。 - `printList`:遍历链表并输出每个节点的值。 - `deleteList`:释放链表的内存。 在 `createList` 函数中,我们首先判断数组是否为空。如果是,则返回空指针。否则,我们创建一个头节点,将第一个数组元素的值存储在头节点中,并将指向下一个节点的指针设置为 `nullptr`。接下来,我们遍历数组中的剩余元素,并为每个元素创建一个新节点。我们将新节点添加到链表的末尾,并将当前指针移动到新节点。 在 `printList` 函数中,我们遍历链表并输出每个节点的值。我们从头节点开始,然后遍历每个节点,并输出当前节点的值。 在 `deleteList` 函数中,我们遍历链表并释放每个节点的内存。我们首先保存下一个节点的指针,以便我们可以继续遍历链表。然后,我们释放当前节点的内存,并将当前指针移动到下一个节点。我们重复这个过程,直到遍历完整个链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值