//向任意指定的位置插入新节点 void insert(List *plist, int data, int pos) { //1.判断坐标是否合法 if(pos < 0 || pos > size(plist)) { //printf("坐标不合法, 元素%d插入失败\n", data); //return; //pos = 0; //默认插入到链表的头节点位置 pos = size(plist); //默认插入到尾部 } //2.处理pos=0时的情况 if(0 == pos) { push_head(plist, data); return; } //3.处理pos=size(plist)时的情况 if(size(plist) == pos) { push_tail(plist, data); return; } //4.创建新节点 Node *pn = create_node(data); //5.处理pos=pos时的情况 Node *pt = plist->head; int i = 0; for(i = 1; i < pos; i++) { //将比pos = 1多出来的next跑光 pt = pt->next; } pn->next = pt->next; pt->next = pn; //6.节点个数加1 ++plist->cnt; }
static void test_vector_back_iterator(void) { using string = mtr::string; using vector = mtr::vector<string>; const char str1[] = "Hello world"; const char str2[] = "Goodbye"; vector v; SHOULD_BE_EQ((int) v.length(), 0, "Length of vector"); auto x = v.push_tail(string(str1)); SHOULD_BE_EQ((int) x.length(), 1, "Length of vector"); auto y = x.push_tail(string(str2)); SHOULD_BE_EQ((int) y.length(), 2, "Length of vector"); auto it = y.back_iterator(); SHOULD_BE_EQ(it(), string(str2), "First string should be the second one appended to vector"); SHOULD_BE_EQ(it.next()(), string(str1), "Second string should be the first one appended to vector"); }
message& message::push_tail(const void* p, size_t size) { return push_tail(element(p, size)); }
message& message::push_tail(const std::string& data) { return push_tail(element(data)); }
message::message(const element& elem) { push_tail(elem); }
message::message(const void* p, size_t size) { push_tail(p, size); }
message::message(const std::string& data) { push_tail(data); }
int main() { //创建单链表, 并且初始化 List list; list.head = NULL; list.tail = NULL; list.cnt = 0; printf("%s\n", empty(&list) ? "空" : "没空"); printf("%s\n", full(&list) ? "满" : "没满"); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); push_head(&list, 11); travel(&list); push_head(&list, 22); travel(&list); push_head(&list, 33); travel(&list); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); push_tail(&list, 44); travel(&list); push_tail(&list, 55); travel(&list); push_tail(&list, 66); travel(&list); printf("链表中有%d个元素\n", size(&list)); printf("----------------\n"); insert(&list, 77, -2); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 88, 0); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 99, 5); printf("链表中有%d个元素\n", size(&list)); travel(&list); insert(&list, 100, 2); printf("链表中有%d个元素\n", size(&list)); travel(&list); printf("--------------------\n"); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); pop_head(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); pop_tail(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); printf("--------------------\n"); del(&list, -2); travel(&list); del(&list, 0); travel(&list); del(&list, 4); travel(&list); del(&list, 1); travel(&list); del(&list, 2); travel(&list); del(&list, 7); travel(&list); printf("--------------------\n"); reverse_list(&list); printf("链表中有%d个元素\n", size(&list)); printf("头节点元素值: %d\n", get_head(&list)); printf("尾节点元素值: %d\n", get_tail(&list)); travel(&list); printf("--------------------\n"); reverse_travel_list(&list); printf("=====清空========\n"); clear(&list); return 0; }