日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实际应用中带头节点的线性链表

發(fā)布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实际应用中带头节点的线性链表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/*========帶頭節(jié)點的線性鏈表類型=========*/ typedef char ElemType//結(jié)點類型 typedef struct LNode {char data;struct LNode *next; }*Link,*Position;//鏈表類型 typedef struct {Link head,tail;int len; }LinkList;/*======================================================*/ /*=======一些在其他函數(shù)定義中會調(diào)用的函數(shù)===============*/ /*======================================================*//*---compare---比較兩個元素的大小關(guān)系*/ int Compare(char a,char b) { return a-b; }/*---visit---*/ int Visit(Link p) {if(...)return 1;elsereturn 0;}/*---length---求鏈的長度*/ int Length(Link s) { int i=0;Link p=NULL;p=s;while(p->next!=NULL){p=p->next;i++;}return i; }/*---print---在屏幕上輸出鏈表的所有元素*/ void Print(LinkList L) { Link p=NULL;p=L.head;if(!p->next){printf("\nThe LinkList is empty.\n\n");return ;}printf("The List:");while(p){printf("%c-",p->data);p=p->next;} }/*======================================================*/ /*==========對帶頭結(jié)點的單鏈線性表進行操作的函數(shù)的定義==*/ /*======================================================*//*---分配由p指向的結(jié)點并賦值為e---*/ Position MakeNode(ElemType e) { Link p=NULL;p=(Link)malloc(sizeof(struct LNode));if(p){p->data=e;p->next=NULL;}else return;return p; }/*---釋放p所指向的結(jié)點-*/ void FreeNode(Link p) { free(p); }/*---構(gòu)造一個由L指向的空的線性表-*/ void InitList(LinkList *L) { L->head=MakeNode('L');//生成頭結(jié)點L->head->next=NULL;/*不是l->head=NULL*/L->tail=L->head;L->len=0; }/*----------銷毀由L指向的線性表---------*/ void DestroyList(LinkList *L) { Link p;p=(*L).tail;while(p!=(*L).head){p=PriorPos(*L,p);FreeNode(p->next);}FreeNode((*L).head); }/*將線性表L置為空表,并釋放原鏈表的頭結(jié)點*/ void ClearList(LinkList *L) { Link p;p=(*L).tail;while(p!=(*L).head){p=PriorPos(*L,p);FreeNode(p->next);}FreeNode((*L).head); }/*---將s指向的結(jié)點插入線性鏈表的第一個結(jié)點之前-*/ void InsFirst(LinkList *L,Link s) { s->next=L->head->next;if(!L->head->next) L->tail=s; /*當(dāng)向一個空的線性表執(zhí)行該操作時*/L->head->next=s;L->len++; }/*---刪除表中第一個結(jié)點并以q返回-*/ void DelFirst(LinkList *L,Link q) { if(!L->head->next){printf("\nThe LinkList is empty,can not delete..\n");return 0;}q=L->head->next;L->head->next=L->head->next->next; }/*---將指針s所的一串結(jié)點鏈接在線性表L的最后一個結(jié)點-*/ void Append(LinkList *L,Link s) { Link q;q=L->head;if(!L->tail){/*考慮到鏈表為空的情況*/L->head->next=s;while(q->next) q=q->next;/*尾結(jié)點的處理*/L->tail=q;}L->tail->next=q=s;while(q->next) q=q->next;/*不能忘了對尾結(jié)點的處理*/L->tail=q;L->len+=Length(s); }/*---刪除線性表l中的尾結(jié)點-*/ void Remove(LinkList *L,Link q) { if(!L->tail){printf("\nthe LinkList is empty,can not remonde..\n");return 0;}q=L->tail; L->tail=PriorPos(*L,q);L->tail->next=NULL; }/*---將s所指向結(jié)點插入在p所指結(jié)點之前-*/ void InsBefore(LinkList *L,Link p,Link s) { Link q;q=PriorPos(*L,p);s->next=p;q->next=s; }/*---將s所指向結(jié)點插入在p所指結(jié)點之后-*/ void InsAfter(LinkList *L,Link p,Link s) { s->next=p->next;p->next=s; }/*---用e更新p所指向的當(dāng)前結(jié)點-*/ void SetCurElem(Link p,ElemType e) { p->data=e; }/*---返回p所指結(jié)點中元素的值-*/ ElemType GetCurElem(Link p) { return p->data; }int Listempty(LinkList L) { /*---若線性表為空表則返回1,否則返回0-*/if(L.head==L.tail) return 1;return 0; }int Listlength(LinkList L) { /*---返回線性表中元素個數(shù)-*/return L.len; }Position GetHead(LinkList L) { /*---返回線性表l中頭結(jié)點的位置-*/return L.head; }Position GetLast(LinkList L) { /*-----返回線性表l中最后一個結(jié)點的位置-------*/return L.tail; }/*---返回p所指結(jié)點的直接前驅(qū)的位置-*/ Position PriorPos(LinkList L,Link p) { Link q;q=L.head;if(q->next==p) return 0;while(q->next!=p) q=q->next;return q; }/*-----返回p所指結(jié)點的直接后繼的位置-------*/ Position NextPos(Link p) { Link q;q=p->next;return q; }/*-----用p返回線性表l中第i個結(jié)點的位置,并返回ok-------*/ void LocatePos(LinkList L,int i,Link p) { p=L.head;if(i<=0||i>Listlength(L)) return 0;while(i){p=p->next;i--;} }/*----返回表中第一個與e滿足一定函數(shù)關(guān)系的結(jié)點次序位置----*/ int LocatElem(LinkList L,ElemType e) { int i=0;Link p;p=L.head->next;while(compare(p->data,e)&&p){p=p->next;++i;}if(!p){/*考慮到查找不到指定元素的情況*/printf("\nthere's no '%c' in this LinkList.",e);return 0;}return i; }/*----用一個函數(shù)遍歷表中所有結(jié)點-------*/ void ListTraverse(LinkList L) { Link p;p=L.head;while(!visit(p)) p=p->next; }



將單鏈線性表La和Lb的元素按值非遞減排列


Status MergeList_L(NLinkList &La, NLinkList &Lb, NLinkList &Lc, int (*compare)(ElemType, ElemType)) { // 算法2.21// 已知單鏈線性表La和Lb的元素按值非遞減排列。// 歸并La和Lb得到新的單鏈線性表Lc,Lc的元素也按值非遞減排列。NLink ha, hb;Position pa, pb, q;ElemType a, b;if (!InitList(Lc)) return ERROR; // 存儲空間分配失敗ha = GetHead(La); // ha和hb分別指向La和Lb的頭結(jié)點hb = GetHead(Lb);pa = NextPos(La, ha); // pa和pb分別指向La和Lb中當(dāng)前結(jié)點pb = NextPos(Lb, hb);while (pa && pb) { // La和Lb均非空a = GetCurElem(pa); // a和b為兩表中當(dāng)前比較元素b = GetCurElem(pb);if ((*compare)(a, b)<=0) { // a≤bDelFirst(ha, q); Append(Lc, q); pa = NextPos(La, pa); } else{ // a>bDelFirst(hb, q); Append(Lc, q); pb = NextPos(Lb, pb); }} // whileif (pa) Append(Lc, pa); // 鏈接La中剩余結(jié)點elseAppend(Lc, pb); // 鏈接Lb中剩余結(jié)點FreeNode(ha); FreeNode(hb); // 釋放La和Lb的頭結(jié)點return OK; } // MergeList_L

總結(jié)

以上是生活随笔為你收集整理的实际应用中带头节点的线性链表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。