2_19.h # include<iostream.h> # include<malloc.h> # include<stdlib.h> typedef struct LNode{ //结点类型 int data; struct LNode *next; }*Link,*Position; typedef struct{ //链表类型 Link head,tail; //分别指向线性链表中的头结点和最后一个结点 int len; //表示长度 }LinkList; void MakeNode(Link &p,int e){ //分配由p指向的值为e的结点 p=(Link)malloc(sizeof(LNode)); p->data=e; } void FreeNode(Link &p){ //释放p所指结点 free(p);p=NULL; } void InitList(LinkList &L){ //构造一个空的线性表L Link p; MakeNode(p,-1); p->next=NULL; L.head=p;L.tail=p;L.len=0; } void DestroyList(LinkList &L){ //销毁线性表L,L不再存在 Link p=L.head; Link q=p->next; while(q){ FreeNode(p); p=q; q=p->next; } FreeNode(p); } void ClearList(LinkList &L){ //置空线性表 if(!L.len){ cout<<"L为空表"<<endl; return; } Link p=L.head->next,q=p->next; L.head->next=NULL; while(q){ FreeNode(p); p=q; q=p->next; } FreeNode(p); L.tail=L.head; L.len=0; } void InsFirst(LinkList &L,Link h,Link s){ //操作一 //已知h指向线性表的头结点,将s所指结点插入在第一个结点之前 s->next=h->next;h->next=s; L.len++; if(L.len==1) L.tail=s; } void DelFirst(LinkList &L,Link h,Link &q){ //操作二 //已知h指向线性表的头结点,删除链表中的第一个结点,并以q返回 if(!L.len){ cout<<"表为空"<<endl; return; } q=h->next; h->next=q->next; L.len--; if(L.len==0) L.tail=h; } void Append(LinkList &L,Link s){ //操作三 //将指针s所指(彼此以指针相链)的一串结点链接在线性表L的最后一个结点 //之后,并改变链尾指针指向新的尾结点 int i=1; Link p=s; while(p->next){i++;p=p->next;} L.len+=i; L.tail->next=s;L.tail=p; } void Remove(LinkList &L,Link &q){ //操作四 //删除线性表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点 if(L.len==0){ cout<<"表为空"<<endl; return; } Link p=L.head; while(p->next!=L.tail) p=p->next; q=p->next; p->next=NULL; L.tail=p;L.len--; } void InsBefore(LinkList &L,Link &p,Link s){ //操作五 //已知p指向线性表L中的一个结点,将s所指结点插入在p所指结点之前 //并修改指针p指向新插入的结点 L.len++;Link q=L.head; while(q->next!=p) q=q->next; s->next=q->next;q->next=s; p=s; } void InAfter(LinkList &L,Link &p,Link s){ //操作六 //已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,并修改指针p指向新插入的结点 L.len++; s->next=p->next;p->next=s; if(L.tail=p) L.tail=s; p=s; } void SetCurElem(Link &p,int e){ //操作七 //已知p指向线性表L的一个结点,用e更新p所指结点中数据元素的值 p->data=e; } int GetCurElem(Link p){ //操作八 //已知p指向线性表中的一个结点,返回p所指结点中数据元素的值 return p->data; } int ListEmpty(LinkList L){ //判空操作 if(L.len) return 0; return 1; } int ListLength(LinkList L){ //求长度 return L.len; } Position GetHead(LinkList L){ //操作九 //返回线性表L中头结点的位置 return L.head; } Position GetLast(LinkList L){ //操作十 //返回线性表L中尾结点的位置 return L.tail; } Position PriorPos(LinkList L,Link p){ //操作十一 //若无前驱,返回NULL //返回p所指结点的前驱结点的位置 if(L.head==p){ cout<<"p所指结点为头结点"<<endl; return NULL; } Link q=L.head; while(q->next!=p) q=q->next; return q; } Position NextPos(LinkList L,Link p){ //操作十二 //已知p指示线性表L中的一个结点,返回p所指结点的直接后继的位置 //若无后继,则返回NULL return p->next; } void LocatePos(LinkList L,int i,Link &p){ //操作十三 //返回p指示线性链表L中第i个结点的位置 if(i<0||i>ListLength(L)) cout<<"有误"<<endl; else{ int j=0;p=L.head; while(j<i){p=p->next;j++;} } } int compare(int e1,int e2){ //判断函数 if(e1==e2) return 1; return 0; } Position LocateElem(LinkList L,int e,int(*compare)(int,int)){ //操作十四 //返回线性链表L中第1个与e满足函数compare()判定关系的元素的位置 //若不存在,则返回NULL Link p=L.head; while(p->next){ p=p->next; if(compare(e,p->data)) return p; } cout<<"不存在"<<endl; return NULL; } void visit(int e){ cout<<e<<" "; } void ListTraverse(LinkList L,void(*visit)(int)){ //遍历操作 Link p=L.head->next; while(p){ visit(p->data);p=p->next; } cout<<endl; } void ListInsert_L(LinkList &L,int i,int e){ //操作十五 //在带头结点的单链线性表L的第i个元素之前插入元素e Link h,s; LocatePos(L,i-1,h);MakeNode(s,e); InsFirst(L,h,s); } void ListDelete_L(LinkList &L,int i,int &e){ //操作十六 //删除第i个元素 Link h,q; LocatePos(L,i-1,h);DelFirst(L,h,q); e=q->data; FreeNode(q); } int compare_L(int e1,int e2){ return e1-e2; } test.cpp # include"2_19.h" void main(){ cout<<"###########测试操作一#########"<<endl; LinkList L; InitList(L); Link s=(Link)malloc(sizeof(LNode)); s->data=1; InsFirst(L,L.head,s); ListTraverse(L,visit); cout<<ListEmpty(L)<<endl; cout<<ListLength(L)<<endl; cout<<"/n###########测试操作二#########"<<endl; Link q; DelFirst(L,L.head,q); cout<<q->data<<endl; cout<<ListEmpty(L)<<endl; cout<<ListLength(L)<<endl; DelFirst(L,L.head,q); DestroyList(L); cout<<"/n###########测试操作三#########"<<endl; LinkList L1; InitList(L1); Link s1=(Link)malloc(sizeof(LNode)); Link s2=(Link)malloc(sizeof(LNode)); Link s3=(Link)malloc(sizeof(LNode)); s1->data=1;s1->next=s2; s2->data=2;s2->next=s3; s3->data=3;s3->next=NULL; Append(L1,s1); cout<<L1.tail->data<<endl; ListTraverse(L1,visit); cout<<"/n###########测试操作四#########"<<endl; Remove(L1,q); cout<<q->data<<endl; cout<<L1.tail->data<<endl; ListTraverse(L1,visit); cout<<L1.len<<endl; cout<<"/n###########测试操作五#########"<<endl; Link s4=(Link)malloc(sizeof(LNode)); s4->data=0;s4->next=NULL; Link p=L1.head->next; InsBefore(L1,p,s4); ListTraverse(L1,visit); cout<<p->data<<endl; cout<<L1.tail->data<<endl; cout<<"/n###########测试操作六#########"<<endl; Link p1=L1.tail; Link s5=(Link)malloc(sizeof(LNode)); s5->data=3; InAfter(L1,p1,s5); ListTraverse(L1,visit); cout<<L1.tail->data<<endl; cout<<"/n###########测试操作七#########"<<endl; Link p3=L1.tail; SetCurElem(p3,30); ListTraverse(L1,visit); cout<<"/n###########测试操作八#########"<<endl; cout<<GetCurElem(p3)<<endl; cout<<"/n###########测试操作九#########"<<endl; cout<<GetHead(L1)->data<<endl; cout<<"/n###########测试操作十#########"<<endl; cout<<GetLast(L1)->data<<endl; cout<<"/n###########测试操作十一#########"<<endl; PriorPos(L1,L1.head); cout<<PriorPos(L1,L1.tail)->data<<endl; cout<<"/n###########测试操作十二#########"<<endl; NextPos(L1,L1.tail); cout<<NextPos(L1,L1.head)->data<<endl; cout<<"/n###########测试操作十三#########"<<endl; LocatePos(L1,5,p);LocatePos(L1,4,p);cout<<p->data<<endl; cout<<"/n###########测试操作十四#########"<<endl; cout<<LocateElem(L1,30,compare)->data<<endl; cout<<"/n###########测试操作十五#########"<<endl; ListTraverse(L1,visit); ListInsert_L(L1,5,-1);cout<<L1.tail->data<<endl; ListTraverse(L1,visit);cout<<L1.tail->data<<endl; cout<<"/n###########测试操作十六#########"<<endl; int e1; ListDelete_L(L1,5,e1);cout<<e1<<endl; ListTraverse(L1,visit);cout<<L1.tail->data<<endl; cout<<L1.len<<endl; } 结果: