1.不带表头的单向链表。
#include<stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
void init_link(Link *head)
{
*head = NULL;
}
void insert_head_node(Link newnode, Link *head)
{
newnode->next = *head;
*head = newnode;
}
int display_link(Link head)
{
if(head == NULL)
{
return -1;
}
Link temp = head;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
int insert_middle_node(Link newnode, Link head, int num)
{
if(head == NULL)
{
return -1;
}
Link temp = head;
while(temp != NULL)
{
if(temp->num == num)
{
newnode->next = temp->next;
temp->next = newnode;
return 0;
}
temp = temp->next;
}
return -1;
}
#if 0
int delete_node(Link newnode, Link *head, int num)
{
if(*head == NULL)
{
return -1;
}
Link temp =*head;
if((*head)->num == num)
{
*head = (*head)->next;
free(temp);
return 0;
}
Link ptr = temp;
temp = temp->next;
while(temp != NULL)
{
if(temp->num == num)
{
ptr->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
ptr = temp;
temp = temp->next;
}
return -1;
}
#endif
int delete_node(Link newnode,Link *head,int num)
{
if(*head == NULL)
{
return -1;
}
Link temp = *head;
if((*head)->num == num)
{
*head = (*head)->next;
free(temp);
return 0;
}
Link ptr = temp;
temp = temp->next;
while(temp != NULL)
{
if(temp->num == num)
{
ptr->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
ptr = temp;
temp = temp->next;
}
return -1;
}
int reverse_link(Link *head)
{
if((*head) == NULL || (*head)->next == NULL)
{
return -1;
}
Link str = *head;
Link ptr = str->next;
Link temp = ptr->next;
while(temp != NULL)
{
ptr->next = str;
str = ptr;
ptr = temp;
temp = temp->next;
}
ptr->next = str;
(*head)->next =NULL;
*head = ptr ;
return -1;
}
int insert_tail_node(Link newnode, Link *head)
{
if(*head == NULL)
{
newnode->next = NULL;
*head = newnode;
}
else
{
Link temp = *head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = NULL;
}
}
int main()
{
Link head;
Link newnode;
init_link(&head);
int i;
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
newnode->num = i + 1;
//insert_head_node(newnode,&head);
insert_tail_node(newnode,&head);
}
display_link(head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
insert_middle_node(newnode,head,6);
printf("middle node:\n");
display_link(head);
delete_node(newnode,&head,3);
printf("delete node:\n");
display_link(head);
reverse_link(&head);
printf("reverse node:\n");
display_link(head);
return 0;
}
2.带表头的链表
#include<stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
void init_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
(*head)->next = NULL;
}
void insert_head_node(Link newnode, Link *head)
{
newnode->next = (*head)->next;
(*head)->next = newnode;
}
int display_link(Link head)
{
Link temp = head->next;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
int insert_middle_node(Link newnode, Link head, int num)
{
Link temp = head;
while(temp != NULL)
{
if(temp->num == num)
{
newnode->next = temp->next;
temp->next = newnode;
return 0;
}
temp = temp->next;
}
return -1;
}
int delete_node(Link newnode,Link *head,int num)
{
if((*head)->next == NULL)
{
return -1;
}
Link temp = *head;
Link ptr = temp;
temp = temp->next;
while(temp != NULL)
{
if(temp->num == num)
{
ptr->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
ptr = temp;
temp = temp->next;
}
return -1;
}
int reverse_link(Link *head)
{
if((*head)->next == NULL || ((*head)->next->next) == NULL)
{
return -1;
}
Link str = *head;
Link ptr = str->next;
Link temp = ptr->next;
while(temp != NULL)
{
ptr->next = str;
str = ptr;
ptr = temp;
temp = temp->next;
}
ptr->next = str;
(*head)->next->next = NULL;
(*head)->next = ptr ;
return -1;
}
int insert_tail_node(Link newnode, Link *head)
{
if((*head)->next == NULL)
{
newnode->next = NULL;
(*head)->next = newnode;
}
else
{
Link temp = *head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = NULL;
}
}
int main()
{
Link head;
Link newnode;
init_link(&head);
int i;
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
newnode->num = i + 1;
//insert_head_node(newnode,&head);
insert_tail_node(newnode,&head);
}
display_link(head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
insert_middle_node(newnode,head,6);
printf("middle node:\n");
display_link(head);
delete_node(newnode,&head,3);
printf("delete node:\n");
display_link(head);
reverse_link(&head);
printf("reverse node:\n");
display_link(head);
return 0;
}
3.带表头的循环链表
#include<stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
void init_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
(*head)->next = *head;
}
void insert_head_node(Link newnode, Link *head)
{
newnode->next = (*head)->next;
(*head)->next = newnode;
}
int display_link(Link head)
{
Link temp = head->next;
while(temp != head)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
int insert_middle_node(Link newnode, Link *head, int num)
{
Link temp = *head;
while(temp->next != *head)
{
if(temp->num == num)
{
printf("a\n");
newnode->next = temp->next;
temp->next = newnode;
return 0;
}
temp = temp->next;
}
return -1;
}
int delete_node(Link newnode,Link *head,int num)
{
if((*head)->next == *head)
{
return -1;
}
Link temp = *head;
Link ptr = temp;
temp = temp->next;
while(temp->next != *head)
{
if(temp->num == num)
{
ptr->next = temp->next;
free(temp);
temp = NULL;
return 0;
}
ptr = temp;
temp = temp->next;
}
return -1;
}
int reverse_link(Link *head)
{
if((*head)->next == *head || ((*head)->next->next) == *head)
{
return -1;
}
Link str = *head;
Link ptr = str->next;
Link temp = ptr->next;
while(temp != *head)
{
ptr->next = str;
str = ptr;
ptr = temp;
temp = temp->next;
}
ptr->next = str;
temp = (*head)->next;
(*head)->next = ptr;
temp->next = *head ;
return -1;
}
void insert_tail_node(Link newnode, Link *head)
{
Link temp = *head;
while(temp->next != *head)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = *head;
}
int main()
{
Link head;
Link newnode;
init_link(&head);
int i;
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
newnode->num = i + 1;
insert_head_node(newnode,&head);
//insert_tail_node(newnode,&head);
}
display_link(head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
insert_middle_node(newnode,&head,6);
printf("middle node:\n");
display_link(head);
delete_node(newnode,&head,3);
printf("delete node:\n");
display_link(head);
reverse_link(&head);
printf("reverse node:\n");
display_link(head);
return 0;
}
4.双向循环链表
#include <stdio.h>
struct node
{
int num;
struct node *prior;
struct node *next;
};
typedef struct node Node;
typedef Node * Dlink;
void init_d_link(Dlink *head)
{
*head = (Dlink)malloc(sizeof(Node));
(*head)->prior = *head;
(*head)->next = *head;
}
void insert_head_node(Dlink newnode,Dlink head)
{
newnode->next = head->next;
head->next->prior = newnode;
head->next = newnode;
newnode->prior = head;
}
void insert_tail_node(Dlink newnode, Dlink head)
{
head->prior->next = newnode;
newnode->prior = head->prior;
newnode->next = head;
head->prior = newnode;
}
int insert_mid_node(Dlink newnode, Dlink head,int num)
{
Dlink temp = head->next;
while(temp != head)
{
if(temp->num == num)
{
newnode->next = temp->next;
temp->next->prior = newnode;
temp->next = newnode;
newnode->prior = temp;
return 0;
}
temp = temp->next;
}
return -1;
}
int delete_node(int num, Dlink head)
{
Dlink temp = head->next;
while(temp != head)
{
if(temp->num == num)
{
temp->prior->next = temp->next;
temp->next->prior = temp->prior;
free(temp);
temp = NULL;
return 0;
}
temp = temp->next;
}
return -1;
}
void display_link(Dlink head)
{
Dlink temp = head->next;
while(temp != head)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
int main()
{
Dlink head;
Dlink newnode;
init_d_link(&head);
int i;
for(i = 0; i < 10; i++)
{
newnode = (Dlink)malloc(sizeof(Node));
newnode->num = i + 1;
//insert_head_node(newnode,head);
insert_tail_node(newnode,head);
}
display_link(head);
newnode = (Dlink)malloc(sizeof(Node));
newnode->num = 11;
insert_mid_node(newnode,head,5);
display_link(head);
delete_node(7,head);
display_link(head);
return 0;
}