Articles Catalogue
1. Delete duplicate elements from the list
Compared with the latter, the former deletes nodes and releases memory in the same way.
void DeleteEqual(PNODE &pHead){ //Delete duplicate elements from the list PNODE p,q,prev; if (p=pHead->next){ prev=p; p=p->next; } while (p){ if (p->data==prev->data){ q=p; p=p->next; prev->next=p; free(q); } else { prev=p; p=p->next; } } }
Operation results:
2. Delete elements larger than min and smaller than max in incremental ordered list
First, find two precursors, release the intermediate nodes, and re-link the list.
void DeleteSelect(PNODE &pHead,int min,int max){ //Delete elements larger than min and smaller than max in incremental ordered list PNODE p=pHead,minPrev,maxPrev; int flag=0; while (p->next){ if(p->next->data>min&&!flag){ minPrev=p; flag=1; } if(p->next->data>=max){ maxPrev=p; break; } p=p->next; } PNODE temp,start; start=minPrev->next; while(start->data!=maxPrev->data){ temp=start; start=start->next; free(temp); temp=NULL; } minPrev->next=maxPrev->next; free(maxPrev); maxPrev=NULL; }
Operation results:
3. Inverse linked list
The first strategy:
void LinkListReverse(PNODE &L){ //Inverse list with more than 2 elements PNODE p,q,s; p=L->next; q=p->next; s=q->next; p->next=NULL; while(s->next){ q->next=p; p=q; q=s; s=s->next; } q->next=p; s->next=q; L->next=s; }
The second strategy
void LinkListReverse2(PNODE &L){ //Inverse linked list PNODE p,s,prev; if (p=L->next){ prev=p; s=p; p=p->next; prev->next=NULL; } while(p){ s=p; p=p->next; s->next=prev; prev=s; } L->next=s; }
Operation results:
Complete code:
#include<iostream> #include <stdlib.h> #include <string.h> using namespace std; typedef struct Node//node { int data;//Data Domain struct Node *next;//Pointer field }NODE, *PNODE;//NODE is equivalent to struct Student st||PNODE is equivalent to struct Node *next PNODE InputStudent(void) { int len;//Number of students NODE stu; PNODE pHead = (PNODE)malloc(sizeof(NODE));//Define a header node and allocate memory for the header node if(NULL == pHead) //Determine whether memory is empty { printf("memory allocation failed,Procedure termination!\n"); exit(-1); } PNODE pTail = pHead;//Define a pointer to a header node pTail->next = NULL;//Empty the pointer field printf("Please enter the number:"); scanf("%d",&len); for(int i=0; i<len; i++) { printf("Please enter _____________%d individual:\n", i+1); cin>>stu.data; PNODE pNew = (PNODE)malloc(sizeof(NODE)); //Allocate memory for new nodes if(NULL == pNew) //Determine whether memory is empty { printf("memory allocation failed,Procedure termination!\n"); exit(-1); } pNew->data = stu.data;//Initialize the data domain of the node pTail->next = pNew;//Hang the new node after the old one pNew->next = NULL;//Clear the pointer field of the new node pTail = pNew;//Move pTail to a new node } return pHead; } void OutputStudent(PNODE pHead)//Output of Student Information { PNODE p = pHead->next;//Define a pointer to traverse student information printf("\n The data are as follows:\n"); while(NULL != p) { printf("%d ", p->data); p = p->next; } } void DeleteEqual(PNODE &pHead){ //Delete duplicate elements from the list PNODE p,q,prev; if (p=pHead->next){ prev=p; p=p->next; } while (p){ if (p->data==prev->data){ q=p; p=p->next; prev->next=p; free(q); } else { prev=p; p=p->next; } } } void DeleteSelect(PNODE &pHead,int min,int max){ //Delete elements larger than min and smaller than max in incremental ordered list PNODE p=pHead,minPrev,maxPrev; int flag=0; while (p->next){ if(p->next->data>min&&!flag){ minPrev=p; flag=1; } if(p->next->data>=max){ maxPrev=p; break; } p=p->next; } PNODE temp,start; start=minPrev->next; while(start->data!=maxPrev->data){ temp=start; start=start->next; free(temp); temp=NULL; } minPrev->next=maxPrev->next; free(maxPrev); maxPrev=NULL; } void LinkListReverse(PNODE &L){ //Inverse linked list PNODE p,q,s; p=L->next; q=p->next; s=q->next; p->next=NULL; while(s->next){ q->next=p; p=q; q=s; s=s->next; } q->next=p; s->next=q; L->next=s; } void LinkListReverse2(PNODE &L){ //Inverse linked list PNODE p,s,prev; if (p=L->next){ prev=p; s=p; p=p->next; prev->next=NULL; } while(p){ s=p; p=p->next; s->next=prev; prev=s; } L->next=s; } int main(){ PNODE L= InputStudent(); cout<<endl<<"The input data are as follows:"; OutputStudent(L); // DeleteEqual(L); // Cout < endl < < "after deletion:"; // OutputStudent(L); // LinkListReverse2(L); // Cout < endl < < after inversion:"; // OutputStudent(L); DeleteSelect(L,2,10); cout<<endl<<"After deletion:"; OutputStudent(L); return 0; }