#include <myhead.h>
#define datatype int
typedef enum{
SLINK = 0,
DLINK
}type_t;
typedef struct singly_link{
datatype data;
struct singly_link *next;
}slink_t;
typedef struct double_link{
datatype data;
struct double_link *prev;
struct double_link *next;
}dlink_t;
void Insert(type_t type, void **head, datatype data);
void Delete(type_t type, void **head);
void Print(type_t type, void *head);
int main(int argc, const char *argv[])
{
slink_t *head = NULL;
Insert(SLINK, (void **)&head, 1);
Insert(SLINK, (void **)&head, 2);
Insert(SLINK, (void **)&head, 3);
Print(SLINK, (void*)head);
Delete(SLINK, (void **)&head);
Print(SLINK, (void*)head);
dlink_t *dhead = NULL;
Insert(DLINK, (void**)&dhead, 4);
Insert(DLINK, (void**)&dhead, 5);
Insert(DLINK, (void**)&dhead, 6);
Print(DLINK, (void*)dhead);
Delete(DLINK, (void**)&dhead);
Print(DLINK, (void*)dhead);
return 0;
}
void Insert(type_t type, void **head, datatype data){
switch(type){
case SLINK:
{
slink_t **header = (slink_t**)head;
slink_t *node = (slink_t*)malloc(sizeof(slink_t));
node->data = data;
if(*header == NULL){
*header = node;
(*header)->next = NULL;
}else{
node->next = *header;
*header = node;
}
}
break;
case DLINK:
{
dlink_t **header = (dlink_t**)head;
dlink_t *node = (dlink_t*)malloc(sizeof(dlink_t));
node->data = data;
node->prev = NULL;
if(*header == NULL){
*header = node;
(*header)->next = NULL;
}else{
node->next = *header;
(*header)->prev = node;
*header = node;
}
}
break;
default:
{
puts("type error");
}
}
}
void Delete(type_t type, void **head){
switch(type){
case SLINK:
{
slink_t **header = (slink_t**)head;
if(*header == NULL){
puts("link is empty");
}else if((*header)->next == NULL){
free(*header);
*header = NULL;
}else{
slink_t *index = *header;
*header = (*header)->next;
free(index);
index = NULL;
}
}
break;
case DLINK:
{
dlink_t **header = (dlink_t**)head;
if(*header == NULL){
puts("link is empty");
}else if((*header)->next == NULL){
free(*header);
*header = NULL;
}else{
dlink_t *index = *header;
*header = (*header)->next;
(*header)->prev = NULL;
free(index);
index = NULL;
}
}
break;
default:
{
puts("type error");
}
}
}
void Print(type_t type, void *head){
switch(type){
case SLINK:
{
slink_t *index = (slink_t *)head;
while(index){
printf("%d\t", index->data);
index = index->next;
}
putchar(10);
}
break;
case DLINK:
{
dlink_t *index = (dlink_t *)head;
while(index){
printf("%d\t", index->data);
index = index->next;
}
putchar(10);
}
break;
default:
{
puts("type error");
}
}
}