// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Question{
int _id;
struct Question* pre;
struct Question* next;
};
void chain_print(struct Question* qFirst){
puts("----------print------------");
struct Question* q = qFirst;
if (qFirst->next == NULL){
puts("没有元素可以打印");
return;
}else{
q = qFirst->next;
}
// 遍历链表
for(q; (q->next) != NULL;q=q->next ) {
printf("%d\n", q->_id);
}
// 最后一项特殊对待
printf("%d\n", q->_id);
}
void chain_add(struct Question* qFirst, struct Question* qAdd){
// 遍历链表
struct Question* q = qFirst;
for(q; (q->next) != NULL;q=q->next ) {
}
// 最后一项
q->next = qAdd;
qAdd->pre = q;
}
void chain_remove(struct Question* qFirst, struct Question* qRemove){
struct Question* qPre = NULL;
struct Question* qNext = NULL;
struct Question* q = qFirst;
if (qFirst == qRemove){
(qFirst->next)->pre = NULL;
qFirst = (qFirst->next);
free(q);
return;
}
// 遍历链表
for(q; (q->next) != NULL;q=q->next ) {
if (q == qRemove){
qPre = q->pre;
qNext = q->next;
if (qPre!=NULL){
qPre->next= qNext;
}
if (qNext!=NULL){
qNext->pre = qPre;
}
free(qRemove);
return;
}
}
// 最后一项
if (q == qRemove){
qPre = q->pre;
if (qPre!=NULL){
qPre->next= qNext;
}
free(qRemove);
}
}
struct Question* chain_get(struct Question* qFirst, int index){
int i = 0;
// 遍历链表
struct Question* q = qFirst;
for(q;
(q->next) != NULL;
q=q->next,i++ ) {
if (index == i){
return q;
}
}
if (index == i){
// 获取最后一个元素
return q;
}
return NULL;
}
int chain_count(struct Question* qFirst){
int i = 0;
// 遍历链表
struct Question* q = qFirst;
for(q;
(q->next) != NULL;
q=q->next,i++ ) {
}
return i;
}
struct Question* newQuestion(int id){
struct Question* q = (struct Question*)malloc(sizeof(struct Question));
memset(q, 0, sizeof(struct Question));
q->_id = id;
return q;
}
void newQuestion(int id, struct Question** q){
*q = (struct Question*)malloc(sizeof(struct Question));
memset(*q, 0, sizeof(struct Question));
(*q)->_id = id;
}
int _tmain(int argc, _TCHAR* argv[])
{
struct Question* qFirst = NULL;
qFirst = newQuestion(0);
struct Question* q1 = NULL;
newQuestion(1,&q1);
chain_add(qFirst, q1);
struct Question* q2 = newQuestion(2);
chain_add(qFirst, q2);
struct Question* q3 = newQuestion(3);
chain_add(qFirst, q3);
struct Question* q4 = newQuestion(4);
chain_add(qFirst, q4);
struct Question* q5 = newQuestion(5);
chain_add(qFirst, q5);
chain_print(qFirst);
printf("get %d\n", chain_get(qFirst, 1)->_id);
printf("get %d\n", chain_get(qFirst, 3)->_id);
printf("get %d\n", chain_get(qFirst, 5)->_id);
//------------------------------
chain_remove(qFirst, q3);
chain_print(qFirst);
chain_remove(qFirst, q5);
chain_print(qFirst);
chain_remove(qFirst, q1);
chain_print(qFirst);
printf("元素个数: %d\n", chain_count(qFirst));
return 0;
}
----------print------------
1
2
3
4
5
get 1
get 3
get 5
----------print------------
1
2
4
5
----------print------------
1
2
4
----------print------------
2
4
元素个数: 2