- // bo2-6.cpp 具有實用意義的線性鏈表(存儲結構由c2-5.h定義)的24個基本操作
- void MakeNode(Link &p,ElemType e)
- { // 分配由p指向的值爲e的結點。若分配失敗,則退出
- p=(Link)malloc(sizeof(LNode));
- if(!p)
- exit(ERROR);
- p->data=e;
- }
- void FreeNode(Link &p)
- { // 釋放p所指結點
- free(p);
- p=NULL;
- }
- void InitList(LinkList &L)
- { // 構造一個空的線性鏈表L
- Link p;
- p=(Link)malloc(sizeof(LNode)); // 生成頭結點
- if(p)
- {
- p->next=NULL;
- L.head=L.tail=p;
- L.len=0;
- }
- else
- exit(ERROR);
- }
- void ClearList(LinkList &L)
- { // 將線性鏈表L重置爲空表,並釋放原鏈表的結點空間
- Link p,q;
- if(L.head!=L.tail) // 不是空表
- {
- p=q=L.head->next;
- L.head->next=NULL;
- while(p!=L.tail)
- {
- p=q->next;
- free(q);
- q=p;
- }
- free(q);
- L.tail=L.head;
- L.len=0;
- }
- }
- void DestroyList(LinkList &L)
- { // 銷燬線性鏈表L,L不再存在
- ClearList(L); // 清空鏈表
- FreeNode(L.head);
- L.tail=NULL;
- L.len=0;
- }
- void InsFirst(LinkList &L,Link h,Link s) // 形參增加L,因爲需修改L
- { // h指向L的一個結點,把h當做頭結點,將s所指結點插入在第一個結點之前
- s->next=h->next;
- h->next=s;
- if(h==L.tail) // h指向尾結點
- L.tail=h->next; // 修改尾指針
- L.len++;
- }
- Status DelFirst(LinkList &L,Link h,Link &q) // 形參增加L,因爲需修改L
- { // h指向L的一個結點,把h當做頭結點,刪除鏈表中的第一個結點並以q返回。
- // 若鏈表爲空(h指向尾結點),q=NULL,返回FALSE
- q=h->next;
- if(q) // 鏈表非空
- {
- h->next=q->next;
- if(!h->next) // 刪除尾結點
- L.tail=h; // 修改尾指針
- L.len--;
- return OK;
- }
- else
- return FALSE; // 鏈表空
- }
- void Append(LinkList &L,Link s)
- { // 將指針s(s->data爲第一個數據元素)所指(彼此以指針相鏈,以NULL結尾)的
- // 一串結點鏈接在線性鏈表L的最後一個結點之後,並改變鏈表L的尾指針指向新的尾結點
- int i=1;
- L.tail->next=s;
- while(s->next)
- {
- s=s->next;
- i++;
- }
- L.tail=s;
- L.len+=i;
- }
- Position PriorPos(LinkList L,Link p)
- { // 已知p指向線性鏈表L中的一個結點,返回p所指結點的直接前驅的位置。若無前驅,則返回NULL
- Link q;
- q=L.head->next;
- if(q==p) // 無前驅
- return NULL;
- else
- {
- while(q->next!=p) // q不是p的直接前驅
- q=q->next;
- return q;
- }
- }
- Status Remove(LinkList &L,Link &q)
- { // 刪除線性鏈表L中的尾結點並以q返回,改變鏈表L的尾指針指向新的尾結點
- Link p=L.head;
- if(L.len==0) // 空表
- {
- q=NULL;
- return FALSE;
- }
- while(p->next!=L.tail)
- p=p->next;
- q=L.tail;
- p->next=NULL;
- L.tail=p;
- L.len--;
- return OK;
- }
- void InsBefore(LinkList &L,Link &p,Link s)
- { // 已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之前,
- // 並修改指針p指向新插入的結點
- Link q;
- q=PriorPos(L,p); // q是p的前驅
- if(!q) // p無前驅
- q=L.head;
- s->next=p;
- q->next=s;
- p=s;
- L.len++;
- }
- void InsAfter(LinkList &L,Link &p,Link s)
- { // 已知p指向線性鏈表L中的一個結點,將s所指結點插入在p所指結點之後,
- // 並修改指針p指向新插入的結點
- if(p==L.tail) // 修改尾指針
- L.tail=s;
- s->next=p->next;
- p->next=s;
- p=s;
- L.len++;
- }
- void SetCurElem(Link p,ElemType e)
- { // 已知p指向線性鏈表中的一個結點,用e更新p所指結點中數據元素的值
- p->data=e;
- }
- ElemType GetCurElem(Link p)
- { // 已知p指向線性鏈表中的一個結點,返回p所指結點中數據元素的值
- return p->data;
- }
- Status ListEmpty(LinkList L)
- { // 若線性鏈表L爲空表,則返回TRUE,否則返回FALSE
- if(L.len)
- return FALSE;
- else
- return TRUE;
- }
- int ListLength(LinkList L)
- { // 返回線性鏈表L中元素個數
- return L.len;
- }
- Position GetHead(LinkList L)
- { // 返回線性鏈表L中頭結點的位置
- return L.head;
- }
- Position GetLast(LinkList L)
- { // 返回線性鏈表L中最後一個結點的位置
- return L.tail;
- }
- Position NextPos(Link p)
- { // 已知p指向線性鏈表L中的一個結點,返回p所指結點的直接後繼的位置。若無後繼,則返回NULL
- return p->next;
- }
- Status LocatePos(LinkList L,int i,Link &p)
- { // 返回p指示線性鏈表L中第i個結點的位置,並返回OK,i值不合法時返回ERROR。i=0爲頭結點
- int j;
- if(i<0||i>L.len)
- return ERROR;
- else
- {
- p=L.head;
- for(j=1;j<=i;j++)
- p=p->next;
- return OK;
- }
- }
- Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType))
- { // 返回線性鏈表L中第1個與e滿足函數compare()判定關係的元素的位置,
- // 若不存在這樣的元素,則返回NULL
- Link p=L.head;
- do
- p=p->next;
- while(p&&!(compare(p->data,e))); // 沒到表尾且沒找到滿足關係的元素
- return p;
- }
- void ListTraverse(LinkList L,void(*visit)(ElemType))
- { // 依次對L的每個數據元素調用函數visit()
- Link p=L.head->next;
- int j;
- for(j=1;j<=L.len;j++)
- {
- visit(p->data);
- p=p->next;
- }
- printf("/n");
- }
- void OrderInsert(LinkList &L,ElemType e,int (*comp)(ElemType,ElemType))
- { // 已知L爲有序線性鏈表,將元素e按非降序插入在L中。(用於一元多項式)
- Link o,p,q;
- q=L.head;
- p=q->next;
- while(p!=NULL&&comp(p->data,e)<0) // p不是表尾且元素值小於e
- {
- q=p;
- p=p->next;
- }
- o=(Link)malloc(sizeof(LNode)); // 生成結點
- o->data=e; // 賦值
- q->next=o; // 插入
- o->next=p;
- L.len++; // 表長加1
- if(!p) // 插在表尾
- L.tail=o; // 修改尾結點
- }
- Status LocateElem(LinkList L,ElemType e,Position &q,int(*compare)(ElemType,ElemType))
- { // 若升序鏈表L中存在與e滿足判定函數compare()取值爲0的元素,則q指示L中
- // 第一個值爲e的結點的位置,並返回TRUE;否則q指示第一個與e滿足判定函數
- // compare()取值>0的元素的前驅的位置。並返回FALSE。(用於一元多項式)
- Link p=L.head,pp;
- do
- {
- pp=p;
- p=p->next;
- }while(p&&(compare(p->data,e)<0)); // 沒到表尾且p->data.expn<e.expn
- if(!p||compare(p->data,e)>0) // 到表尾或compare(p->data,e)>0
- {
- q=pp;
- return FALSE;
- }
- else // 找到
- {
- q=p;
- return TRUE;
- }
- }
bo2-6.cpp 具有實用意義的線性鏈表(存儲結構由c2-5.h定義)的24個基本操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.