1.利用双指针查找链表中间值
//利用双指针查找链表中间值
void Middle(LinkList L){
assert(L != NULL);
LinkNode *p = L->next , *q = L->next ;
while (q != NULL&&q->next !=NULL){
q = q->next->next;
p = p->next;
}
cout << p->data << endl;
}
#include"stdafx.h"
#include<assert.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
#define n 20
typedef int ElemType;
typedef struct Lnode{
ElemType data;
struct Lnode *next;
struct Lnode *prev;
}CNode, *PCNode;
typedef struct{
PCNode head;
int count;
}CLinkList, *PCLinkList;
bool Pop_Back(CLinkList *s);
//购买节点
CNode *BuyNode(){
CNode *p;
p = (CNode*)malloc(sizeof(CNode));
if (p == NULL) exit(1);
memset(p, 0, sizeof(CNode));
return p;
}
//初始化
void Init_List(CLinkList *s){
s->head = BuyNode();
s->count = 0;
s->head->next = s->head;
s->head->prev = s->head;
}
//打印链表
void Print_CList(CLinkList *s){
assert(s != NULL);
CNode *p = s->head->next;
while (p != s->head){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//查找值为value的元素
CNode *Find_Value(CLinkList *s, ElemType val){
assert(s != NULL);
CNode *p = s->head->next;
while (p != s->head&&p->data != val){
cout << p->data << endl;
p = p->next;
}
if (p->data == val){
return p;
}
else return NULL;
}
//在某一指定节点之前插入一个节点
bool Insert_prev(CLinkList *s, CNode *p, ElemType val){
assert(s != NULL);
if (p == NULL) return false;
CNode *r = BuyNode();
r->data = val;
r->prev = p->prev;
r->next = p;
r->prev->next = r;
p->prev = r;
s->count++;
return true;
}
//头插
bool Push_Frong(CLinkList *s, ElemType val){
assert(s != NULL);
CNode *p;
p = s->head->next;
if (Insert_prev(s, p, val)) return true;
else return false;
}
//尾插
bool Push_Back(CLinkList *s, ElemType val){
assert(s != NULL);
CNode *p = s->head;
if (Insert_prev(s, p, val)) return true;
else return false;
}
//按位置查询
CNode * Find_Pos(const CLinkList *s, ElemType index){
assert(s != NULL);
if (index < 1)return NULL;
CNode *p = s->head->next;
int i = 1;
while (p != s->head &&i < index){
p = p->next;
i++;
}
return p;
}
//按位置插入
bool Insert_Pos(CLinkList *s, int pos, ElemType val){
assert(s != NULL);
if (pos<1 || pos>s->count) return false;
int i = 0;
CNode *p = s->head;
while (i < pos){
p = p->next;
i++;
}
if (Insert_prev(s, p, val)) return true;
else return false;
}
//清空
void Clear_Stack(CLinkList * s){
assert(s != NULL);
CNode *p = s->head;
while (p->next != s->head){
Pop_Back(s);
}
}
//摧毁双链表
void Destory_Stack(CLinkList * s){
assert(s != NULL);
Clear_Stack(s);
free(s->head);
s->head = NULL;
}
//获取元素个数
int Get_size(CLinkList *s){
assert(s != NULL);
return s->count;
}
//判空
bool Empty_CList(CLinkList *s){
assert(s != NULL);
return 0 == s->count;
}
//双链表节点删除
bool Delete(CLinkList *s, CNode *ptr){
assert(s != NULL);
if (ptr == NULL) return false;
ptr->prev->next = ptr->next;
ptr->next->prev = ptr->prev;
s->count--;
free(ptr);
return true;
}
//头删
bool Pop_Front(CLinkList *s){
assert(s != NULL);
CNode *p = s->head->next;
Delete(s, p);
return true;
}
//尾删
bool Pop_Back(CLinkList *s){
assert(s != NULL);
CNode *p = s->head;
while (p->next != s->head){
p = p->next;
}
Delete(s, p);
return true;
}
//删除某一值的元素
void Remove(CLinkList *s, ElemType val){
assert(s != NULL);
CNode *p = s->head->next;
while (p->next != s->head){
if (val == p->data){
Delete(s, p);
break;
}
p = p->next;
}
}
//删除值为val的所有元素
void Remove_All(CLinkList *s, ElemType val){
assert(s != NULL);
CNode *p = s->head->next ;
while (p!= s->head){
if (val == p->data){
p = p->next;
Delete(s, p->prev );
}
else{
p = p->next;
}
}
}
int main(){
CLinkList s;
Init_List(&s);
ElemType arr[] = { 12, 12, 12, 12, 12 };
for (int i = 0; i <5; i++){
Push_Back(&s, arr[i]);
}
Print_CList(&s);
Remove_All(&s, 12);
Print_CList(&s);
/*
int x = Get_size(&s);
cout << x << endl;
*/
//CNode *p = Find_Pos(&s, 4);
//cout << "第三个节点的数据为:" << endl;
//cout << p->data << endl;
cout << "幸得识君桃花面,从此阡陌多暖春!" << endl;
}