单链表
#include <stdio.h>
#include<stdlib.h>
#define Mac_OK 1
#define Mac_ERR 0
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
int is_malloc_ok(Link new_node)
{
if(new_node == NULL)
{
printf("malloc error ! \n");
return Mac_ERR;
}
else
{
return Mac_OK;
}
}
void creat_link(Link *head)
{
*head = (Link) malloc (sizeof(Node));
(*head) -> next = NULL;
printf("piz=======creatlink\n");
}
void creat_node( Link *new_node ,int i)
{
int num = 0;
*new_node = (Link) malloc (sizeof(Node));
while(is_malloc_ok(*new_node) == Mac_ERR)
{
*new_node = (Link) malloc (sizeof(Node));
num++;
if(num == 10)
{
printf("num = %d\n", num);
goto pool;
}
}
(* new_node) -> num = i;
pool:
if(num >= 10)
{
printf("Malloc error!_0_creat\n");
exit(-1);
}
printf("new_node = %d\n",(*new_node) -> num);
// printf("plz========creatnode\n");
}
void insert_node_head(Link head, Link new_node )
{
new_node -> next = head -> next;
head -> next = new_node;
}
void insert_node_tail(Link head , Link new_node)
{
Link p ;
p = head;
while(p -> next != NULL)
{
p = p -> next;
}
p -> next = new_node;
new_node -> next = NULL;
}
void insert_node_mid_front(Link head , Link new_node , int num_loc)
{
Link p;
Link q;
Link ptr;
ptr = p = q = head -> next;
if (p == NULL)
{
ptr = new_node;
new_node -> next = NULL;
}
else
{
while((p -> num != num_loc) && (p -> next != NULL))
{
q = p;
p = p -> next;
}
if(p == ptr)
{
new_node -> next = ptr;
ptr = new_node;
}
else if((p -> next == NULL) && (p -> num != num_loc))
{
p -> next = new_node;
new_node -> next = NULL;
}
else
{
q -> next = new_node;
new_node -> next = p;
}
}
}
void node_del(Link head,int num_val)
{
Link q;
Link p;
p = q = head -> next;
if(p == NULL)
{
printf("empty links \n");
}
else
{
while(p -> num != num_val && p -> next != NULL)
{
q = p ;
p = p -> next;
}
if(p -> num == num_val)
{
free(p);
p = p -> next;
}
else if(p -> next == NULL && p -> num != num_val)
{
printf("not found \n");
}
else
{
q -> next = p -> next;
free(p);
}
}
}
void display(Link head)
{
int i = 0;
Link p;
p = head -> next;
if(p == NULL)
{
printf("the link is empty!\n");
}
else
{
while(p != NULL)
{
printf("num = %d\n",p -> num);
p = p -> next;
i++;
if(i == 10)
{
return;
}
}
}
}
void print_star()
{
printf("|*****************************|");
printf("\n");
}
void release_link(Link head)
{
Link p;
p = (head -> next);
if (p == NULL)
{
printf("the link is empty !\n");
}
else
{
while(p -> next != NULL)
{
free(p);
p = p -> next;
}
}
printf("release complete\n");
}
void reorder_link(Link head)
{
Link p1 , p2 , p3;
Link ptr;
ptr = p1 = p2 = p3 = head -> next;
if(ptr == NULL)
{
printf("link is empty");
return;
}
p2 = ptr -> next;
if(p2 -> next == NULL)
{
p2 -> next = p1;
p1 -> next = NULL;
ptr = p2;
return;
}
p3 = p2 -> next;
while(p3 -> next != NULL)
{
p2 -> next = p1;
p1 = p2;
p2 = p3;
p3 = p3 -> next;
}
p2 -> next = p1;
p3 -> next = p2;
ptr -> next = NULL;
ptr -> next = p3;
return;
}
int main()
{
Link head = NULL;
Link new_node = NULL;
Link first_node = NULL;
int i;
int num_loc;
int num_val;
printf("plz input the num location:\n");
scanf("%d", &num_loc);
printf("plz input the num value:\n");
scanf("%d", &num_val);
creat_link(&head);
for(i = 1 ; i < 9 ; i++)
{
creat_node(&new_node , i);
printf("new_node = %d\n",new_node -> num);
insert_node_head(head , new_node);
}
display(head);
printf("plz input a num to delate :\n");
scanf("%d",&num_val);
node_del(head , num_val);
display(head);
release_link(head);
free(head);
return 0;
}
循环链表
#include <stdio.h>
#include <stdlib.h>
#define Mac_ok 1
#define Mac_err 0
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void creat_link(Link *head)
{
*head = (Link)malloc(sizeof(Node)) ;
(*head) -> next = *head;
}
int is_malloc(Link new_node)
{
if(new_node == NULL)
{
printf("Malloc error!\n");
return Mac_err;
}
else
{
return Mac_ok;
}
}
void creat_node(Link *new_node, int i)
{
int num = 0;
*new_node = (Link)malloc(sizeof(Node));
while(is_malloc(*new_node) == Mac_err)
{
*new_node = (Link)malloc(sizeof(Node));
num++;
if(num == 10)
{
goto pool;
}
}
(*new_node) -> num = i;
pool:
{
if(num >= 10)
{
printf("Malloc error!_creat node\n");
exit (-1);
}
}
}
void insert_front(Link head , Link new_node)
{
new_node -> next = head -> next;
head -> next = new_node;
}
void display(Link head)
{
Link p ;
p = head -> next;
if(p == head)
{
printf("The link is empty!\n");
return;
}
while(p != head)
{
printf("node num = %d\n",p -> num);
p = p-> next;
}
}
void del_node(Link head , int num_val)
{
Link p , q;
p = q = head -> next;
if(p == head)
{
printf("The link is empty!\n");
return;
}
while(p -> num != num_val && p -> next != head)
{
q = p ;
p = p -> next;
}
if((p -> next == head) &&(p -> num == num_val))
{
printf("Not found!\n");
}
else
{
q -> next = p -> next;
free(p);
}
}
void insert_midfront(Link head , Link new_node , int num_loc)
{
Link p , q;
p = q = head -> next;
if(p == head)
{
p = new_node;
new_node -> next = head;
return ;
}
while((p -> num != num_loc) && (p -> next != head))
{
q = p ;
p = p -> next;
}
if((p -> next == head)&&(p -> num != num_loc))
{
p -> next = new_node;
new_node -> next = head;
}
else
{
q -> next = new_node;
new_node -> next = p;
}
return;
}
void release(Link *head)
{
Link p ;
p = *head;
if(p -> next == *head)
{
printf("Empty Link\n");
return ;
}
p = p -> next;
while(p != *head)
{
*head = p -> next;
free(p);
p = *head;
}
free(*head);
p = NULL;
printf("release complete!\n");
}
void print_star()
{
printf("******************************\n");
}
int main()
{
int i ;
Link new_node = NULL;
Link head = NULL;
int num_val = 0;
int num_loc = 0;
creat_link(&head);
for(i = 0; i < 10; i ++)
{
creat_node(&new_node , i);
insert_front(head , new_node);
}
display(head);
print_star();
printf("plz input loc &val\n");
scanf("%d",&num_loc);
scanf("%d",&num_val);
creat_node(&new_node , num_val);
insert_midfront(head , new_node , num_loc);
display(head);
release(&head);
display(head);
return 0;
}