// link_list.h -- header of link list
#ifndef __LINK_LIST_H__
#define __LINK_LIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int datatype;
typedef struct node{
datatype val;// store data
struct node* next;// store next node
}node_t, * pnode_t;
// node init
pnode_t node_create(datatype);
// link list init
pnode_t link_init();
// check if empty
bool link_is_empty(pnode_t);
// insert to head
void link_head_insert(pnode_t, datatype);
// insert to tail
void link_tail_insert(pnode_t, datatype);
// insert by index
void link_index_insert(pnode_t, datatype, int);
// remove from head
void link_head_remove(pnode_t, datatype*);
// remove from tail
void link_tail_remove(pnode_t, datatype*);
// remove by index
void link_index_remove(pnode_t, datatype*, int);
// link list clear
void link_clear(pnode_t);
// link list destroy
void link_destroy(pnode_t*);
// show link list
void link_show(pnode_t);
#endif
// link_list.c -- implement of link list
#include "link_list.h"
// node init
pnode_t node_create(datatype val){
pnode_t pnode = (pnode_t)malloc(sizeof(node_t));
if(pnode == NULL){
perror("node_create> node create fail> ");
return NULL;
}
else{
pnode->val = val;
pnode->next = NULL;
return pnode;
}
}
// link list init
pnode_t link_init(){
pnode_t head = (pnode_t)malloc(sizeof(node_t));
if(head == NULL){
perror("link_init> head create fail> ");
return NULL;
}
else{
head->val = 0;// store number of node(except head node)
head->next = NULL;// set next to NULL
printf("link_init> link list inited\n");
return head;
}
}
// check if empty
bool link_is_empty(pnode_t p){
if(p == NULL){
printf("link_is_empty> link list had not inited\n");
return false;
}
else{
printf("link_is_empty> %d node(s) in link list\n", p->val);
return (p->val == 0);
}
}
// insert to head
void link_head_insert(pnode_t p, datatype d){
if(p == NULL){
printf("link_head_insert> link list had not inited\n");
return;
}
else{
pnode_t node = node_create(d);
node->next = p->next;
p->next = node;
p->val++;
return;
}
}
// insert to tail
void link_tail_insert(pnode_t p, datatype d){
if(p == NULL){
printf("link_tail_insert> link list had not inited\n");
return;
}
else{
pnode_t node = node_create(d);
pnode_t temp = p;
while(temp->next != NULL)
temp = temp->next;
temp->next = node;
p->val++;
return;
}
}
// insert by index
void link_index_insert(pnode_t p, datatype d, int n){
if(p == NULL){
printf("link_index_insert> link list had not inited\n");
return;
}
else if(n <= 1){
link_head_insert(p, d);
return;
}
else if(n > p->val){
link_tail_insert(p, d);
return;
}else{
pnode_t temp = p;
int index = n - 1;
while(index--)
temp = temp->next;
pnode_t node = node_create(d);
node->next = temp->next;
temp->next = node;
p->val++;
}
}
// remove from head
void link_head_remove(pnode_t p, datatype* pd){
if(p == NULL){
printf("link_head_remove> link list had not inited\n");
return;
}
else if(pd == NULL){
printf("link_head_remove> return-val receiver had not inited\n");
return;
}
else if(link_is_empty(p)){
printf("link_head_remove> link list is empty\n");
return;
}
else{
pnode_t temp = p->next;
*pd = temp->val;
p->next = temp->next;
p->val--;
free(temp);
return;
}
}
// remove from tail
void link_tail_remove(pnode_t p, datatype* pd){
if(p == NULL){
printf("link_tail_remove> link list had not inited\n");
return;
}
else if(pd == NULL){
printf("link_tail_remove> return-val receiver had not inited\n");
return;
}
else if(link_is_empty(p)){
printf("link_tail_remove> link list is empty\n");
return;
}
else{
pnode_t i = p;
while(i->next->next != NULL)
i = i->next;
pnode_t j = i->next;
*pd = j->val;
i->next = j->next;
free(j);
p->val--;
return;
}
}
// remove by index
void link_index_remove(pnode_t p, datatype* pd, int n){
if(p == NULL){
printf("link_index_remove> link list had not inited\n");
return;
}
else if(n <= 1){
link_head_remove(p, pd);
return;
}
else if(n > p->val){
link_tail_remove(p, pd);
return;
}else{
pnode_t i = p;
int index = n - 1;
while(index--)
i = i->next;
pnode_t j = i->next;
i->next = j->next;
*pd = j->val;
free(j);
p->val--;
}
}
// link list clear
void link_clear(pnode_t p){
if(p == NULL){
printf("link_clear> link list had not inited\n");
return;
}
else if(link_is_empty(p)){
printf("link_clear> link list is empty\n");
return;
}
else{
pnode_t i = p->next, j = i->next;
while(j->next != NULL){
free(i);
i = j;
j = j->next;
}
free(i);
p->next = NULL;
p->val = 0;
printf("link_clear> link list cleared\n");
return;
}
}
// link list destroy
void link_destroy(pnode_t* pp){
if(pp == NULL){
printf("link_destroy> link list pointer had not inited\n");
return;
}
else if(*pp == NULL){
printf("link_destroy> link list had not inited\n");
return;
}
else{
link_clear(*pp);
free(*pp);
*pp = NULL;
printf("link_destroy> link list destroyed\n");
return;
}
}
// show link list
void link_show(pnode_t p){
if(p == NULL){
printf("link_show> link list had not inited\n");
return;
}
else{
pnode_t temp = p->next;
while(temp){
printf("%-4d", temp->val);
temp = temp->next;
}
putchar(10);
return;
}
}
#include "link_list.h"
#include <time.h>
#include <stdlib.h>
int main(){
srand(time(0));
pnode_t head = link_init();
link_is_empty(head);
for(int i = 0; i < 15; i++){
link_head_insert(head, rand()%100);
}
for(int i = 0; i < 15; i++){
link_tail_insert(head, rand()%100);
}
link_is_empty(head);
link_show(head);
datatype ret;
link_head_remove(head, &ret);
link_tail_remove(head, &ret);
link_is_empty(head);
link_show(head);
link_index_insert(head, -1, 5);
link_index_remove(head, &ret, 6);
link_is_empty(head);
link_show(head);
link_clear(head);
link_is_empty(head);
link_destroy(&head);
return 0;
}
link_init> link list inited
link_is_empty> 0 node(s) in link list
link_is_empty> 30 node(s) in link list
46 47 14 0 61 58 98 49 56 23 51 54 59 77 11 94 32 67 61 76 59 82 59 40 43 57 98 33 79 29
link_is_empty> 30 node(s) in link list
link_is_empty> 29 node(s) in link list
link_is_empty> 28 node(s) in link list
47 14 0 61 58 98 49 56 23 51 54 59 77 11 94 32 67 61 76 59 82 59 40 43 57 98 33 79
link_is_empty> 28 node(s) in link list
47 14 0 61 -1 98 49 56 23 51 54 59 77 11 94 32 67 61 76 59 82 59 40 43 57 98 33 79
link_is_empty> 28 node(s) in link list
link_clear> link list cleared
link_is_empty> 0 node(s) in link list
link_is_empty> 0 node(s) in link list
link_clear> link list is empty
link_destroy> link list destroyed
sizeof(struct A):2+8+1+(1)=12
sizeof(T):1+(1)+12+8=22