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