#include<stdio.h>
#include<stdlib.h>
/*******************************************************************************
* data structure and macro definition
*******************************************************************************/
#define MAX 5
typedef enum{
OK =1,
ERROR = -1
}STATUS_EN;
typedef enum{
TRUE = 1,
FALSE = 0
}BOOL;
typedef int Elemtype;
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
/******************************************************************************
* function implement
******************************************************************************/
/******************************************************************************
* function : destroy_list
* description : destroy link list
* input : struct LNode **ppHead(a pointer to the link head pointer)
* output : struct LNode **pphead
* return value : void
* AUthor : HanyoungXue
* Date : 2018-4-14
******************************************************************************/
// a link list with a head node
void destroy_list(LinkList *ppHead){
LNode *p = *ppHead;//head pointer
LNode *q = p->next;
while(p && p->next){
q = p->next;
p = q->next;
free(q);
q = NULL;
}
free(*ppHead);
*ppHead = NULL;
}
/******************************************************************************
* function : init_list
* description : init list
* input : struct LNode **ppHead
* output : struct Londe **ppHead
* return value : STATUS_EN(OK/ERROR)
* author : HanyoungXue
* date : 2018-4-14
******************************************************************************/
STATUS_EN init_list(LinkList *ppHead){
if (*ppHead){
destroy_list(ppHead);
}
LNode *p = (LNode*)malloc(sizeof(LNode));
p->next = NULL;
p->data = 0;
*ppHead = p;
return OK;
}
/*****************************************************************************
* function : insert_elem
* description : insert element at index == i
* input : struct LNode **pphead;
const int pos
const Elemtype elem
* output : struct LNode **pphead
* return value : STATUS_EN(OK/ERROR)
* Author : HanyoungXue
* Date : 2018-4-14
****************************************************************************/
STATUS_EN insert_elem(LinkList *ppHead,const int pos,Elemtype elem){
LNode *p = *ppHead;
LNode *s = NULL;
// finds the last node front the node with index = pos
int i = 0;
while(p && i< pos){
p = p->next;
i++;
}
// if doesn't find the last node, then return error
if (!p || i > pos)
{
return ERROR;
}
// new a Node
s = (LNode*)malloc(sizeof(LNode));
if (!s)
{
return ERROR;
}
// insert the node
s->data = elem;
s->next = p->next;
p->next = s;
return OK;
}
/* ***************************************************************************
* function : remove_elem
* description : remove the elem at index=pos,and return elem's data
* input : struct Lnode **pphead
const int pos
Elemtype *pElem
* output : struct LNode **ppHead
ElemType *pElem
* return value : STATUS_EN(OK/ERROR)
* Author : HanyoungXue
* Date : 2018-4-14
*****************************************************************************/
STATUS_EN remove_elem(LinkList *ppHead,const int pos,Elemtype *pElem){
LNode *p = *ppHead;
LNode *q = NULL;
int i=0;
while(p && p->next &&i<pos){
p = p->next;
i++;
}
// the postion of delete is unvalidable
if (!(p->next)||i>pos)
{
return ERROR;
}
// delete and release the node
q = p->next;
*pElem = q->data;
p->next = q->next;
free(q);
return OK;
}
/**********************************************************************************
* function : create_list
* description : create a single linkList bases on a array
* input : struct LNode **ppHead,
const ElemType elems[],
const int n
* output : struct LNode **ppHead
* return value : STATUS_EN(OK/ERROR)
* Author : HanyoungXUe
* date : 2018-4-14
*********************************************************************************/
STATUS_EN create_list(LinkList *ppHead,const Elemtype elems[],const int n){
int i = 0;
STATUS_EN status = OK;
for (int i = 0; i < n; i++)
{
status = insert_elem(ppHead,i,elems[i]);
if (status!=OK)
{
return status;
}
}
return OK;
}
/* *****************************************************************************
* function : is_empty_list
* description : to judge whether a list is null
* input : struct LNode **ppHead
* output : N/A
* return value : BOOL
* Author : HanyoungXue
* date : 2018-4-14
*******************************************************************************/
BOOL is_empty_list(LinkList pHead){
if (!pHead ||!(pHead->next)){
return TRUE;
}else{
return FALSE;
}
}
/* *****************************************************************************
* function : get_elem
* description : get an elem from single LinkList where index = pos
* input : struct LNode *pHead,
* Elemtype *pElem,
* const int pos
* output : Elemtype *pElem
* return value : STATUS_EN(OK/ERROR)
* author : HanyoungXue
* date : 2018-4-14
*******************************************************************************/
STATUS_EN get_elem(LinkList pHead,Elemtype *pElem,const int pos){
int i=0;
LNode *p = pHead -> next;
while(p && i<= pos){
if (i==pos){
*pElem = p->data;
return OK;
}else{
p = p->next;
i++;
}
}
return ERROR;
}
/* ******************************************************************************
* function : locate_elem
* description : gets the position which the elem be firstly found on LinkList.
* if doesn't find it, then return -1
* input : struct LNode *pHead
* const Elemtype elem
* output : N/A
* return value : int
* author : HanyoungXue
* date : 2018-4-14
********************************************************************************/
int locate_elem(LinkList pHead,const Elemtype elem){
LNode *p = pHead ->next;
int pos = 0;
while(p){
if (p->data==elem){
return pos;
}else{
pos ++;
p = p->next;
}
}
return -1;
}
/********************************************************************************
* function : get_length
* description : get the length of single LinkList
* input : struct LNode *pHead
* output : N/A
* return value : int
* author : HanyoungXue
* date : 2018-4-14
********************************************************************************/
int get_length(LinkList pHead){
if (!pHead ||!(pHead->next)){
return 0;
}
int length = 0;
LNode *p = pHead->next;
while(p){
p = p->next;
length ++;
}
return length;
}
/*********************************************************************************
* function : print_list
* description : print the all list
* input : struct LNode *pHead
* output : N/A
* return value : N/A
* author : HanyougXue
* date : 2018-4-14
*********************************************************************************/
void print_list(LinkList pHead){
if (is_empty_list(pHead)){
printf("link is empty!\n");
return;
}
LNode *p = pHead->next;
printf("linkList:\n");
while(p){
printf("%d\t", p->data);
p = p->next;
}
printf("\n");
}
/*********************************************************************************
* function : reverse_list
* description : reverse single LinkList
* input : struct LNode **ppHead
* output : struct LNode **ppHead
* return value : N/A
* author : HanyoungXue
* date : 2018-4-14
*********************************************************************************/
void reverse_list(LinkList *ppHead){
if (!(*ppHead)||!((*ppHead)->next)){
return;
}
LNode *prev = NULL;
LNode *cur = (*ppHead)->next;
LNode *nex = NULL;
while(cur){
nex = cur->next;
cur->next = prev;
prev = cur;
cur = nex;
}
(*ppHead)->next = prev;
}
int main(int argc, char const *argv[]){
Elemtype A[MAX] = {4,5,2,1,3};
LinkList list = NULL;
init_list(&list);
create_list(&list,A,MAX);
print_list(list);
reverse_list(&list);
print_list(list);
insert_elem(&list,5,6);
print_list(list);
return 0;
}
C語言——單鏈表(帶頭結(jié)點(diǎn))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門谢翎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沐旨,你說我怎么就攤上這事森逮。” “怎么了磁携?”我有些...
- 文/不壞的土叔 我叫張陵褒侧,是天一觀的道長。 經(jīng)常有香客問我,道長闷供,這世上最難降的妖魔是什么烟央? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮这吻,結(jié)果婚禮上吊档,老公的妹妹穿的比我還像新娘。我一直安慰自己唾糯,他們只是感情好怠硼,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著移怯,像睡著了一般香璃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舟误,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼秧骑!你這毒婦竟也來了版确?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬榮一對(duì)情侶失蹤乎折,失蹤者是張志新(化名)和其女友劉穎绒疗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骂澄,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡吓蘑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坟冲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片士修。...
- 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響侄榴,放射性物質(zhì)發(fā)生泄漏雹锣。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一癞蚕、第九天 我趴在偏房一處隱蔽的房頂上張望蕊爵。 院中可真熱鬧,春花似錦桦山、人聲如沸攒射。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽会放。三九已至,卻和暖如春钉凌,著一層夾襖步出監(jiān)牢的瞬間咧最,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓酸纲,卻偏偏與公主長得像捣鲸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子福青,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- C語言是面向過程的摄狱,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個(gè)結(jié)構(gòu)化語言,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)无午。C程...
- 作者原創(chuàng)媒役,轉(zhuǎn)載請(qǐng)注明出處。 個(gè)人博客:renzhe.name 用 C 語言實(shí)現(xiàn)鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的線性表宪迟,即單鏈表酣衷。本文...
- 單鏈表的C語言算法實(shí)現(xiàn) 自己用C語言實(shí)現(xiàn)的單鏈表算法,有什么不正確的地方次泽,請(qǐng)各位共同討論與指正穿仪。
- /*單鏈表的頭插法和尾插法c語言實(shí)現(xiàn)*/ #include #include #include #define S...