線性表之鍊錶(單鏈表)

2021-08-03 11:33:38 字數 3553 閱讀 8898

線性表:由n(n>=0)個相同型別資料元素組成,並且可以 在任意位置進行插入和刪除資料元素操作的有限序列。

單鏈表:它是一種鏈式儲存的線性表,用一組位址任意的儲存單元存放線性表        的資料元素,稱儲存單元為乙個節點。

**實現:

list.h

#include#include#includetypedef int datatype;

typedef struct node

node, *pnode, *plist;

pnode create(datatype d); //建立鍊錶

void pushback(plist p_list, datatype d);//尾插

void printlist(plist p_list);//列印

void printlistrecur(plist p_list); //遞迴倒敘列印鍊錶

void printlistback(plist p_list);//倒序列印

pnode find(plist p_list, datatype x); //查詢

void deletenohead(pnode pos);//刪除無頭節點的非尾節點

void insertnohead(pnode pos,datatype d);///插入無頭結點的非頭結點

pnode josephlist(plist p_list); //鍊錶環化

pnode joseplistk(plist p_list, int k);

pnode lnverse(plist p_list);//逆置鍊錶

pnode mergelist(plist p_list1, plist p_list2);//合併兩個鍊錶

pnode qsortmergelist(plist p_list1, plist p_list2);//合併有序兩個鍊錶之後依然有序

pnode findmidnode(plist p_list);//查詢中間節點

pnode findthelastk(plist p_list, int k);//查詢倒數第k個節點

#endif //__list_h__

list.c

#include"list.h"

pnode create(datatype d)//建立

p_list->data = d;

p_list->next = null;

return p_list;

}void pushback(plist p_list, datatype d)//尾插

while (p1->next != null)

p2->data = d;

p1->next = p2;

p2->next = null;

}void printlist(plist p_list)//列印

printf("%d->null\n", p_list->data);

}//一.從尾到頭列印鍊錶

void printlistrecur(plist p_list) //遞迴倒敘列印鍊錶

printf("%d->", p_list->data); }

}pnode l = null;

void printlistback(plist p_list) //倒序列印

p = p->next;

} l = p;

if (l == p_list)

break;

p = p_list;

} printf("\n");

}//二.刪除無頭結點的非尾節點(不能遍歷鍊錶)

pnode find(plist p_list, datatype x) //查詢

} printf("找到了\n");

return (p = p->next);

}void deletenohead(pnode pos) //刪除無頭節點非尾節點

//三.在無頭單鏈表的乙個非頭節點前插入乙個節點

void insertnohead(pnode pos,datatype d) //插入無頭結點的非頭結點前

//四.單鏈表實現約瑟夫環(josephcircle)

pnode josephlist(plist p_list) //鍊錶環化

p_list->next = p;

return p;

}pnode joseplistk(plist p_list, int k)

pnode p1 = p_list;

pnode p2 = p_list->next;

pnode p3 = p_list->next->next;

p1->next = p3;

free(p2);

if (p1->next == p1)

return p1;

joseplistk(p3, k);

}//五.鍊錶逆置

pnode lnverse(plist p_list)//逆置鍊錶

return phead;

}//六.合併兩個有序鍊錶, 合併後依然有序

pnode mergelist(plist p_list1, plist p_list2)//合併兩個鍊錶

p->next = p_list2;

return p_list1;

}pnode qsortmergelist(plist p_list1, plist p_list2)//合併有序兩個鍊錶之後依然有序

if ((p_list1 != null) && (p_list2 == null))

if ((p_list1->data) >= (p_list2->data))

else

return newhead;

}//七.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

pnode findmidnode(plist p_list)//查詢中間節點

} return p1;

}//八.查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

pnode findthelastk(plist p_list, int k)//查詢倒數第k個節點

while (p2->next != null)

return p1;

}

test.c 部分測試

#include"list.h"

void test1()

void test2()

int main()

線性表 單鏈表

define crt secure no deprecate define crt secure cpp overload standard names 1 includeusing namespace std typedef struct node node node headpointer 頭指...

線性表 單鏈表

單鏈表結構與順序儲存結構對比 一 儲存分配方式 1 順序儲存結構用一段連續的儲存單元依次儲存線性表的資料元素 2 單鏈表採用鏈式儲存結構,用一組任意的儲存單元存放線性表的元素 二 時間效能 1 查詢 順序儲存結構o 1 單鏈表o n 2 插入和刪除 順序儲存結構o n 單鏈表找到位置後插入刪除時間o...

線性表 單鏈表

template struct node template class linklist 無參建構函式,建立只有頭結點的空鍊錶 linklist t a int n 有參建構函式,建立有n個元素的單鏈表 linklist 析構函式 int length 求單鏈表的長度 t get int i 按位查...