#include
#include
using namespace std;
typedef struct Node{
int iVal;
Node *pUp,*pDown;
}DNode,*PNode;
class NodeList{
private:
PNode mHead;
char mName[1024];
CRITICAL_SECTION g_cs;
public:
NodeList(){
mHead=NULL;
mName[0]='\0';
}
~NodeList(){
Clean();
}
PNode Clone(){
PNode tmp=NULL , tmp1=mHead ,tmp2;
while(tmp1){
if(tmp){
tmp2->pDown=new DNode();
tmp2->pDown->iVal=tmp1->iVal;
tmp2->pDown->pDown=NULL;
tmp2->pDown->pUp=tmp2;
tmp2=tmp2->pDown;
}else{
tmp2=new DNode();
tmp2->iVal=tmp1->iVal;
tmp2->pUp=NULL;
tmp2->pDown=NULL;
tmp=tmp2;
}
tmp1=tmp1->pDown;
}
return tmp;
}
bool Append(PNode node){
EnterCriticalSection(&g_cs);
bool bRet=false;
PNode tmp=mHead;
if(node){
if (tmp){
while(tmp->pDown){
tmp=tmp->pDown;
}
tmp->pDown=node;
node->pUp=tmp;
}else{
mHead=node;
}
bRet=true;
}
LeaveCriticalSection(&g_cs);
return bRet;
}
void Append(int val){
PNode tmp=mHead , newNode;
EnterCriticalSection(&g_cs);
if(tmp)
while(tmp->pDown){
tmp=tmp->pDown;
}
newNode=new DNode();
newNode->iVal=val;
newNode->pDown=NULL;
if(tmp){
newNode->pUp=tmp;
tmp->pDown=newNode;
}else{
newNode->pUp=NULL;
mHead=newNode;
}
LeaveCriticalSection(&g_cs);
//cout<
bool Delete(int val){
EnterCriticalSection(&g_cs);
PNode tmp=mHead;
bool bRet=false;
while(tmp){
if ( tmp->iVal==val){
bRet=true;
break;
}else{
tmp=tmp->pDown;
}
}
if(bRet){
if(tmp==mHead){
mHead=tmp->pDown;
if ( tmp->pDown ){
mHead->pUp=NULL;
}
}else{
tmp->pUp->pDown=tmp->pDown;
if ( tmp->pDown){
tmp->pDown->pUp=tmp->pUp;
}
}
delete(tmp);
//cout<
//cout<
LeaveCriticalSection(&g_cs);
return bRet;
}
void Print(){
PNode tmp=mHead;
int c=0;
cout<
cout<
tmp=tmp->pDown;
c++;
}
cout<
PNode Find(int val,PNode pStart){
PNode Ret=NULL;
PNode tmp=pStart;
while(tmp){
if ( tmp->iVal==val){
Ret=tmp;
break;
}else{
tmp=tmp->pDown;}
}
return tmp;
}
void BJ(){
cout<
while(tmp){
if( Find(tmp->iVal,tmp->pDown) ){
this->Delete(tmp->iVal);
tmp=mHead;
}else {
tmp=tmp->pDown;
}
}
cout<
void JJ(){
cout<
mHead=NULL;
while(tmp){
if( Find(tmp->iVal,tmp->pDown) ){
if( ! Find(tmp->iVal,mHead) )
Append(tmp->iVal);
}
tmp=tmp->pDown;
}
tmp2=mHead;
mHead=tmp1;
Clean();
mHead=tmp2;
cout<
void Clean(){
//cout<
if ( mHead->pDown ){
mHead=mHead->pDown;
delete(mHead->pUp);
}else{
delete(mHead);
mHead=NULL;
}
}
mHead=NULL;
//cout<
void setName(char *name){
char *tmp=name;
int c=0;
while(*tmp){
this->mName[c]=*tmp;
tmp++;
c++;
}
mName[c]='\0';
}
};
int _tmain(int argc, _TCHAR* argv[])
{
/*(3,5,8,11), B=(2,6,8,9,11,15,20*/
/*NodeList tmp,tmp1,tmp2,tmp3;
tmp.setName("链表1");
tmp.Append(3);
tmp.Append(5);
tmp.Append(8);
tmp.Append(11);
tmp1.setName("链表2");
tmp1.Append(2);
tmp1.Append(6);
tmp1.Append(8);
tmp1.Append(9);
tmp1.Append(11);
tmp1.Append(15);
tmp1.Append(20);
tmp.Print();
tmp1.Print();
tmp2.setName("链表3");
tmp2.Append(tmp.Clone());
tmp2.Append(tmp1.Clone());
tmp2.Print();
tmp2.BJ();
tmp2.Print();
tmp2.Clean();
tmp2.Print();
tmp2.Append(tmp.Clone());
tmp2.Append(tmp1.Clone());
tmp2.JJ();
tmp2.Print();*/
int k;
cin>>k;
return 0;
}
#include
#include
#include
struct dllist {
int number;
struct dllist *next;
struct dllist *prev;
};
CCriticalSection mysec;
struct dllist *head, *tail;
void initial_node(struct dllist *lnode);
void append_node(struct dllist *lnode);
void insert_node(struct dllist *lnode, struct dllist *after);
void remove_node(struct dllist *lnode);
int main(void) {
struct dllist *lnode;
int i = 0;
/* add some numbers to the double linked list */
for(i = 0; i <= 5; i++) {
lnode = (struct dllist *)malloc(sizeof(struct dllist));
lnode->number = i;
append_node(lnode);
}
/* print the dll list */
for(lnode = head; lnode != NULL; lnode = lnode->next) {
printf("%d\n", lnode->number);
}
/* destroy the dll list */
while(head != NULL)
remove_node(head);
return 0;
}
void append_node(struct dllist *lnode) {
if(head == NULL) {
head = lnode;
lnode->prev = NULL;
} else {
tail->next = lnode;
lnode->prev = tail;
}
tail = lnode;
lnode->next = NULL;
}
void insert_node(struct dllist *lnode, struct dllist *after) {
lnode->next = after->next;
lnode->prev = after;
if(after->next != NULL)
after->next->prev = lnode;
else
tail = lnode;
after->next = lnode;
}
void remove_node(struct dllist *lnode) {
if(lnode->prev == NULL)
head = lnode->next;
else
lnode->prev->next = lnode->next;
if(lnode->next == NULL)
tail = lnode->prev;
else
lnode->next->prev = lnode->prev;
}
void initial_node(struct dllist *lnode) {
mysec.Lock();
//临界区锁定,进行数据处理
head = tail = NULL;
mysec.Unlock();//处理后解除临界区的锁定
}