線性表:由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 按位查...