链表,不用类

#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);
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/Perce_Issac/article/details/83176973