無頭單鏈表的一些基本操作

2021-09-27 02:06:57 字數 3446 閱讀 7134

實現以下功能

plist plistinit(plist *phead);//初始化

void plistpushback(plist phead, datatype data);//尾插

plist pbuynewnode(datatype data);//建立乙個新節點

void plistshow(plist phead);//列印

void plistdeleteall(plist *phead, datatype val);//刪除鍊錶中所有等於val的節點

void plistreversal(plist *phead);//反轉單鏈表

void plistreciprocalkal(plist *phead);// 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點

//將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的

plist plistsplice(plist *phead, plist *ptail);

//給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個 中間結點

void plistfindmiddle(plist *phead);

直接上**:

list.h

#ifndef _list_h_

#define _list_h_

#define _crt_secure_no_warnings

#include#include#includetypedef int datatype;

typedef struct plist

list,*plist;

plist plistinit(plist *phead);//初始化

void plistpushback(plist phead, datatype data);//尾插

plist pbuynewnode(datatype data);//建立乙個新節點

void plistshow(plist phead);//列印

void plistdeleteall(plist *phead, datatype val);//刪除鍊錶中所有等於val的節點

void plistreversal(plist *phead);//反轉單鏈表

void plistreciprocalkal(plist *phead);// 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點

//將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的

plist plistsplice(plist *phead, plist *ptail);

//給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個 中間結點

void plistfindmiddle(plist *phead);

#endif // !_list_h_

list.c

#include"list.h"

plist pbuynewnode(datatype data)//建立乙個新節點

pnewnode->data = data;

pnewnode->_pnext = null;

return pnewnode;

}void plistpushback(plist* phead, datatype data)//尾插

else

pcur->_pnext = pnewnode; }}

void plistshow(plist phead)//列印

printf("\n");

}void plistdeleteall(plist* phead, datatype val)//刪除鍊錶中所有等於val的節點

ptmp = (*phead)->_pnext;

free(*phead);

(*phead) = ptmp;

} pcur = *phead;

ptmp = pcur;

while (ptmp->_pnext)

else

}if (ptmp->data == val) }

void plistreversal1(plist *phead)//反轉單鏈表1:三指標法

*phead = pslow;

}void plistreversal2(plist *phead)//反轉單鏈表2:頭插法(不建立新鍊錶)

plist pcur = pslow;

while (pslow->_pnext)

(*phead)->_pnext = null;

pslow->_pnext = *phead;

*phead = pcur;

}void plistreversal3(plist *phead)//反轉單鏈表3:頭插法(建立新鍊錶)

*phead = pnewnode->_pnext;

free(pnewnode);

}void plistreciprocalkal(plist *phead, int k)// 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點

plist pfast = *phead;

plist pslow = *phead;

while (--k && pfast)

if (null == pfast)

while (pfast->_pnext)

printf("the reciprocal %d is %d\n",tmp, pslow->data);

}//將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的

plist plistsplice(plist *phead, plist *ptail)

else

plist ptmp = pnewnode;

while(insert && beinsert)

else

pnewnode = pnewnode->_pnext;

} if (insert)

else

return ptmp;

}//給定乙個帶有頭結點 head 的非空單鏈表 ,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個 中間結點

void plistfindmiddle(plist *phead)

printf("the intermediate element is %d\n", pslow->data);

}

test.c

#include"list.h"

void funs()

int main()

輸出結果:

無頭單鏈表的操作

節點結構 typedef定義 不帶頭節點的單鏈表 typedef int sdatatype 節點結構 typedef struct slistnode node,pnode 鍊錶結構 typedef定義 給乙個鍊錶結構 typedef struct slist slist 鍊錶的初始化 1.斷言 ...

單鏈表的一些基本操作

本文主要介紹了單鏈表的初始化 頭插 頭刪 尾插 尾刪 查詢 指定位刪除 指定數刪除 指定位插入 銷毀 排序等.標頭檔案 ifndef linklist h define linklist h include include includetypedef int datatype typedef st...

單鏈表操作 無頭節點

ifndef singlelist h define singlelist h 這是沒有頭結點的版本檔案 有頭結點的版本更簡單些,操作統一 include include include include typedef int elemtype typedef struct nodenode,lin...