#include <iostream>
#define ElementType int
typedef struct LNode {
ElementType data;
struct LNode *next;
} LNode, *LinkList;
/**
* 头插法:元素顺序与插入顺序相反
* @param L
* @return
*/
LinkList HeadInsert(LinkList &L) {
LNode *node;
L = (LinkList) malloc(sizeof(LNode));
for (int i = 1; i < 10; i++) {
node = (LNode *) malloc(sizeof(LNode));
node->data = i;
node->next = L->next;
L->next = node;
}
return L;
}
/**
* 尾查法:元素顺序与插入顺序一致
* @param L
* @return
*/
LinkList TailInsert(LinkList &L) {
L = (LinkList) malloc(sizeof(LNode));
LNode *s, *r = L;
for (int i = 1; i < 10; i++) {
s = (LNode *) malloc(sizeof(LNode));
s->data = i;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
/**
* 获取指定位置元素
* @param L
* @param index
* @return
*/
LNode *GetElemByIndex(LinkList L, int index) {
int j = 1;
if (index == 0) {
return L;
}
LNode *node = L->next;
while (node && j < index) {
node = node->next;
j++;
}
return node;
}
/**
* 在位置插入元素 时间复杂度O(n)
* @param L
* @param e
* @param i
*/
void insertElem(LinkList &L,ElementType e,int i){
LNode *p = GetElemByIndex(L,i-1);
LNode *s;
s =(LNode*)malloc(sizeof(LNode));
s->data =e;
s->next=p->next ;
p->next=s ;
}
/**
* 移除指定位置节点
* @param L
* @param index
*/
void remove(LinkList &L,int index) {
LNode *pre = GetElemByIndex(L, index-1); //找到要删除的前继节点
LNode *deleteNode = pre->next; //pre->next就是要删除的节点
pre->next = deleteNode->next;//将要删除节点的后继指向pre的next
free(deleteNode);
}
/**
* 根据元素值获取节点
* @param L
* @param e
* @return
*/
LNode *GetElemByValue(LinkList L, ElementType e){
LNode *node = L->next;
while (node!= NULL && node->data !=e){
node = node->next;
}
return node;
}
void print(LinkList L) {
LNode *node = L->next;
while (node) {
std::cout << node->data << std::endl;
node = node->next;
}
}
int getLinkListLength(LinkList L){
int len =0;
LNode *node = L->next;
while (node) {
len++;
node = node->next;
}
return len;
}
int main() {
LinkList linkList;
HeadInsert(linkList);
print(linkList);
LNode *node = GetElemByIndex(linkList,1);
std::cout<< node->data <<std::endl;
TailInsert(linkList);
insertElem(linkList,100,3);
print(linkList);
remove(linkList,3);
std::cout << "\n" << std::endl;
print(linkList);
std::cout << "\n" << std::endl;
getLinkListLength(linkList);
return 0;
}