首先看代码
template <typename ElementType> struct node {
ElementType data;
struct node<ElementType> *next;
};
typedef struct node<int> *Linklist;
// i is the position, j is pointer of the return
bool GetElem(Linklist list, int i, int* j) {
Linklist p;
p = list->next;
int pos = 1;
while (p->next&&pos < i) {
p = p->next;
pos++;
}
if(pos>i||p == nullptr) {
return false;
}
*j = p->data;
return true;
}
//the pos is counted from the first node, pos is from 1 to length
bool DelElem(Linklist list, int pos) {
int i = 0;
if (GetElem(list, pos, &i)) {
Linklist p = list;
for (int j = 1; j < pos; j++) {
p = p->next;
}
Linklist pnew = p->next;
p->next = pnew->next;
free(pnew);
return true;
}
return false;
}
bool InsertElem(Linklist list, int pos, int elem) {
int data;
if (GetElem(list, pos, &data)) {
Linklist newnode;
newnode = (Linklist)malloc(sizeof(node<int>));
newnode->data = elem;
Linklist p = list->next;
for (int i = 1; i < pos; i++) {
p = p->next;
}
Linklist temp = p->next;
// careful the following two lines.
newnode->next = temp;
p->next = newnode;
return true;
}
}
Linklist Revert(Linklist list) {
Linklist p, pr, q;
p = list->next;
q = nullptr;
list->next = nullptr;
while (p) {
pr = p->next;
p->next = q;
q = p;
p = pr;
}
list->next = q;
return list;
}
void CreateListHead(Linklist *L, int length) {
srand(time(nullptr));
*L = (Linklist)malloc(sizeof(node<int>));
// the head node holds the list length.
(*L)->data = length;
(*L)->next = nullptr;
for (int i = 0; i < length; i++)
{
Linklist p = (Linklist)malloc(sizeof(node<int>));
p->data = rand();
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateListTail(Linklist *L, int length) {
srand(time(nullptr));
(*L) = (Linklist)malloc(sizeof(node<int>));
Linklist pnext = (*L);
for (int i = 0; i < length; i++)
{
Linklist p = (Linklist)malloc(sizeof(node<int>));
p->data = rand();
pnext->next = p;
pnext = p;
}
pnext->next = nullptr;
}
void DeleteList(Linklist *L) {
Linklist p, q;
p = (*L)->next;
while (p)
{
q = p->next;
free(p);
p = q;
}
(*L)->next = nullptr;
}
int main(int argc, char **argv) {
std::cout << "A cook for linked list." << std::endl;
Linklist L, p;
CreateListHead(&L, 9);
p = L;
for (int i = 0 ;i < 9; i++)
{
p = p->next;
printf("%d - %d\n", i+1, p->data);
}
int got;
GetElem(L, 3, &got);
printf("Got %d\n Revert... \n", got);
Revert(L);
p = L;
for (int i = 0; i < 9; i++)
{
p = p->next;
printf("%d - %d\n", i + 1, p->data);
}
InsertElem(L, 3, 271828);
printf("Insert \n");
p = L;
for (int i = 0; i < 10; i++)
{
p = p->next;
printf("%d - %d\n", i + 1, p->data);
}
DelElem(L, 3);
printf("Delete\n");
p = L;
for (int i = 0; i < 9; i++)
{
p = p->next;
printf("%d - %d\n", i + 1, p->data);
}
DeleteList(&L);
getchar();
}