實際應用中帶頭節點的線性鏈表

/*========帶頭節點的線性鏈表類型=========*/
typedef char ElemType//結點類型
typedef struct LNode
{char data;struct LNode *next;
}*Link,*Position;//鏈表類型
typedef struct
{Link head,tail;int len;
}LinkList;/*======================================================*/
/*=======一些在其他函數定義中會調用的函數===============*/
/*======================================================*//*---compare---比較兩個元素的大小關系*/
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;}
}/*======================================================*/
/*==========對帶頭結點的單鏈線性表進行操作的函數的定義==*/
/*======================================================*//*---分配由p指向的結點并賦值為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所指向的結點-*/
void FreeNode(Link p)
{          free(p);
}/*---構造一個由L指向的空的線性表-*/
void InitList(LinkList *L)
{      L->head=MakeNode('L');//生成頭結點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置為空表,并釋放原鏈表的頭結點*/
void ClearList(LinkList *L)
{     Link p;p=(*L).tail;while(p!=(*L).head){p=PriorPos(*L,p);FreeNode(p->next);}FreeNode((*L).head);
}/*---將s指向的結點插入線性鏈表的第一個結點之前-*/
void InsFirst(LinkList *L,Link s)
{    s->next=L->head->next;if(!L->head->next) L->tail=s;       /*當向一個空的線性表執行該操作時*/L->head->next=s;L->len++;
}/*---刪除表中第一個結點并以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所的一串結點鏈接在線性表L的最后一個結點-*/
void Append(LinkList *L,Link s)
{  Link q;q=L->head;if(!L->tail){/*考慮到鏈表為空的情況*/L->head->next=s;while(q->next) q=q->next;/*尾結點的處理*/L->tail=q;}L->tail->next=q=s;while(q->next) q=q->next;/*不能忘了對尾結點的處理*/L->tail=q;L->len+=Length(s);
}/*---刪除線性表l中的尾結點-*/
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所指向結點插入在p所指結點之前-*/
void InsBefore(LinkList *L,Link p,Link s)
{   Link q;q=PriorPos(*L,p);s->next=p;q->next=s;
}/*---將s所指向結點插入在p所指結點之后-*/
void InsAfter(LinkList *L,Link p,Link s)
{    s->next=p->next;p->next=s;
}/*---用e更新p所指向的當前結點-*/
void SetCurElem(Link p,ElemType e)
{         p->data=e;
}/*---返回p所指結點中元素的值-*/
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)
{      /*---返回線性表中元素個數-*/return L.len;
}Position GetHead(LinkList L)
{     /*---返回線性表l中頭結點的位置-*/return L.head;
}Position GetLast(LinkList L)
{      /*-----返回線性表l中最后一個結點的位置-------*/return L.tail;
}/*---返回p所指結點的直接前驅的位置-*/
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所指結點的直接后繼的位置-------*/
Position NextPos(Link p)
{     Link q;q=p->next;return q;
}/*-----用p返回線性表l中第i個結點的位置,并返回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滿足一定函數關系的結點次序位置----*/
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;
}/*----用一個函數遍歷表中所有結點-------*/
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的頭結點hb = GetHead(Lb);pa = NextPos(La, ha);  // pa和pb分別指向La和Lb中當前結點pb = NextPos(Lb, hb);while (pa && pb) {     // La和Lb均非空a = GetCurElem(pa);  // a和b為兩表中當前比較元素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中剩余結點elseAppend(Lc, pb);        // 鏈接Lb中剩余結點FreeNode(ha);   FreeNode(hb);              // 釋放La和Lb的頭結點return OK;
} // MergeList_L


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453412.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453412.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453412.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab中歐姆如何表示,在excel中歐姆符號怎么打

在excel中歐姆符號怎么打&#xff0c;相信對于好多熟練用excel的朋友來說&#xff0c;是很簡單不過的&#xff0c;但是對于有些初學者來說&#xff0c;就是菜鳥啦&#xff0c;就有點懵懵懂懂的感覺了&#xff0c;畢竟剛接觸的東西還沒用過嘛。但是&#xff0c;沒關系今天筆者就…

原生js系列之DOM工廠模式

寫在前面 如今&#xff0c;在項目中使用React、Vue等框架作為技術棧已成為一種常態&#xff0c;在享受帶來便利性的同時&#xff0c;也許我們漸漸地遺忘原生js的寫法。 現在&#xff0c;是時候回歸本源&#xff0c;響應原始的召喚了。本文將一步一步帶領大家封裝一套屬于自己的…

武術與軟件設計 - 簡單即是最好

偶然間在公車上看見一個講中國功夫的特輯&#xff0c;說道香港武打片的發展歷程&#xff0c;當然就不得不提起李小龍先生&#xff0c;我們知道他截拳道的威力&#xff0c;這時候我記得在看李小龍傳奇時他所說的一些話&#xff0c;當他和美國一個高手比武后他輸了&#xff0c;最…

matlab的概述,Matlab概述

MATLAB(矩陣實驗室)是數字計算&#xff0c;可視化和編程的第四代高級編程語言和交互式環境。MATLAB是由MathWorks開發的。它允許矩陣操縱&#xff0c;繪制功能和數據; 實現算法; 創建用戶界面; 與其他語言編寫的程序(包括C語言&#xff0c;C&#xff0c;Java和FORTRAN)進行交互…

形參和實參

形參&#xff1a;全稱為“形式參數”是在定義函數名和函數體的時候使用的參數&#xff0c;目的是用來接收調用該函數時傳遞的參數。形參的作用是實現主調函數與被調函數之間的聯系&#xff0c;通常將函數所處理的數據&#xff0c;影響函數功能的因素或者函數處理的結果作為形參…

sizeof和strlen的區別

strlen——get the length of a string.size_t strlen(const char *string);Each ofthese functions returns the number of characters instring, notincluding the terminating null character.//函數返回string里的字符數&#xff0c;不包括終止字符\0sizeofThe sizeof keyw…

位置參數及操作符號

特殊字符對應的處理參數&#xff1a; 參數說明$0當前執行的腳本文件名&#xff0c;若全路徑執行&#xff0c;則顯示腳本路徑$n當前執行腳本的第n個參數值&#xff0c;若n>9&#xff0c;則需寫成${10}$#當前傳參總個數$$腳本運行的當前進程ID號,用例&#xff1a;當一個進程重…

python變量命名可以有特殊符號嗎,和孩子一起學習python之變量命名規則

下面是關于變量名(也稱為標識符)的一些規則必須以一個字母或一個下劃線字符開頭。后面可以使用一個字母、數字或下劃線字符的序列&#xff0c;長度不限。字母可以是大寫或小寫&#xff0c;大小寫是不同的。也就是說&#xff0c;Ax不同于aX。數字可以是從0到9(包括0到9)的任意數…

C語言中*和

(一) 在定義時&#xff0c;* 是一個標識符&#xff0c;聲明該變量是一個指針&#xff0c;比如說int *p; 那p就是一個指向int型的指針&#xff1b; 在調用時&#xff0c; &#xff08;1&#xff09;*p是指指針p指向的那個變量&#xff0c;比如說之前有int a5&#xff1b;int …

IT人的好習慣和不良習慣總結

好習慣&#xff1a; 細節一&#xff1a;在電腦旁放上幾盆植物&#xff0c;傳說仙人掌可以有效地吸收輻射&#xff0c;但是會扎到人&#xff0c;而且有沒效果也沒科學根據&#xff0c;不推薦&#xff1b;其實只要是綠色植物就可以&#xff0c;植物可以讓你多點氧氣&#xff0c;保…

【BZOJ 3326】[Scoi2013]數數 數位dp+矩陣乘法優化

挺好的數位dp……先說一下我個人的做法:經過觀察,發現這題按照以往的思路從后往前遞增,不怎么好推,然后我就大膽猜想,從前往后推,發現很好推啊,維護四個變量,從開始位置到現在有了i個數 f[i]:所有數的所有未包含最后一位的子串的和 s[i]:所有數的所有后綴子串的和 c[i]:所有數的…

zookeeper偽集群(在一臺機器上集群)

2019獨角獸企業重金招聘Python工程師標準>>> 創建一下的目錄結構zookeeper-3.4.10是你下載的zookeeper的解壓包 /zookeeper_cluster----/server_one|---/data|myid(文件)|---/datalog|---/zookeeper-3.4.10|---/bin|---/conf|---zoo.cfg|---..... |---/....----/ser…

mongo的php查詢,使用PHP進行簡單查詢的mongo查詢速度慢

我有一個非常簡單的使用PHP執行的Mongo Query。我相信查詢執行得非常快&#xff0c;因為當我在終端上運行它時&#xff0c;它幾乎可以立即完成&#xff0c;并且當我解釋()時&#xff0c;它表明它正在1-2ms內執行。但是&#xff0c;當我去迭代游標并將內容放入數組時&#xff0c…

順序存儲結構和鏈式存儲結構的優缺點

&#xff08;一&#xff09;順序存儲結構和鏈式存儲結構的優缺點比較&#xff0c;以及使用情況。 1 優缺點 ① 順序存儲時&#xff0c;相鄰數據元素的存放地址也相鄰&#xff08;邏輯與物理統一&#xff09;&#xff1b;要求內存中可用存儲單元的地址必須是連續的。 優點&…

大話軟件開發與開車的共同點

昨天路上開車&#xff0c;突然有了這個想法&#xff0c;做軟件開發與開車&#xff0c;竟然有這么多的相似之處&#xff0c;大致整理了一下思路&#xff0c;和大家分享一下。 一、目的 開車的目的有3個&#xff0c;第一是為了讓自己到底目的地(上班族)&#xff0c;第二是為了兜…

Spring核心接口之Ordered

一、Ordered接口介紹Spring中提供了一個Ordered接口。從單詞意思就知道Ordered接口的作用就是用來排序的。Spring框架是一個大量使用策略設計模式的框架&#xff0c;這意味著有很多相同接口的實現類&#xff0c;那么必定會有優先級的問題。于是Spring就提供了Ordered這個接口&a…

將本地代碼上傳至github

注冊github賬號 https://github.com/ 安裝git工具 https://git-for-windows.github.io 1.在github中創建一個項目 2.填寫相應信息&#xff0c;點擊create Repository name: 倉庫名稱 Description(可選): 倉庫描述介紹 Public, Private : 倉庫權限&#xff08;公開共享&#xff…

禪道 php api,云禪道有API的方式可以獲取數據嗎

api相關手冊&#xff1a;api接口查看&#xff0c;可以本地搭建和云禪道相同版本的禪道&#xff0c;然后admin 后臺 二次開發 api&#xff0c;可以查看接口列表。api調用步驟PATH_INFO方式1、訪問 http://x.com/api-getsessionid.json獲取禪道session信息2、使用上一步獲取的ses…

鏈表的頭結點和尾節點的用處

某些情況下設置尾指針的好處 尾指針是指向終端結點的指針&#xff0c;用它來表示單循環鏈表可以使得查找鏈表的開始結點和終端結點都很方便&#xff0c;設一帶頭結點的單循環鏈表&#xff0c;其尾指針為rear&#xff0c;則開始結點和終端結點的位置分別是rear->next->ne…

經驗從哪里來?從痛苦中來!

1 剛才發博客&#xff0c;寫的幾百字丟失&#xff0c;讓我知道下次一定要在記事本里寫好&#xff0c;再復制過來&#xff0c;避免丟失了 2 程序忘記備份&#xff0c;辛苦一個多月的東西沒有了&#xff0c;只能找到1月前的版本&#xff0c;讓我知道了&#xff0c;重要的東西必須…