数据结构:管理数据的方式
重要的数据结构:链表、平衡二叉树、红黑数、哈希表
(一)、链表
节点:1>数据域 2>链接域
单链表特点:最后一个链接域为NULL
带表头的链表特点:头结点无数据域,只有链表域
写链表步骤:
1、定义节点类型
2、确定链接域、数据域:int num; struct node *next;
3、重命名:typedef struct node Node; typedef Node *Link;
4、创建链表:Link head;
单向循环链表:
#include <stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node* Link;
void creat_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
(*head)->next = *head;
}
void insert_head_link(Link *head,Link *newnode)
{
(*newnode)->next = (*head)->next;
(*head)->next = *newnode;
}
void display_head_link(Link *head)
{
Link temp = (*head)->next;
while(temp != *head)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
void insert_tail_link(Link *head,Link *newnode)
{
Link temp = *head;
while(temp->next != *head)
{
temp = temp->next;
}
temp->next = *newnode;
(*newnode)->next = *head;
}
void insert_mid_nod(int num,Link *head,Link *newnode)
{
Link temp = *head;
while(temp->next != *head)
{
if(temp->num == num)
{
(*newnode)->next = temp->next;
temp->next = *newnode;
}
temp = temp->next;
}
}
void del_nod(int num,Link *head)
{
Link temp = *head;
Link ptr = temp;
while(temp->next != *head)
{
//temp = temp->next;
if(temp->num == num)
{
ptr->next = temp->next;
}
ptr = temp;
temp = temp->next;
}
}
int link_reverse(Link *head)
{
if((*head)->next == *head || (*head)->next->next == *head)
{
return -1;
}
else
{
Link ptr = *head;
Link ktr = ptr->next;
Link temp = ktr->next;
while(temp != *head)
{
ktr->next = ptr;
ptr = ktr;
ktr = temp;
temp = temp->next;
}
ktr->next = ptr;
(*head)->next->next = *head;
(*head)->next = ktr;
}
}
int main()
{
int i;
Link head;
Link newnode;
creat_link(&head);
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if(newnode == NULL)
{
printf("malloc erroe!\n");
exit(1);
}
else
{
newnode->num = i + 1;
//insert_head_link(&head,&newnode);
insert_tail_link(&head,&newnode);
}
}
//display_head_link(&head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
//insert_mid_nod(5,&head,&newnode);
//display_head_link(&head);
//del_nod(5,&head);
//display_head_link(&head);
link_reverse(&head);
display_head_link(&head);
<p>
return 0;
}</p>
双向循环链表:
#include <stdio.h>
struct node
{
int num;
struct node *prior;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
void creat_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
(*head)->prior = *head;
(*head)->next = *head;
}
void insert_head_node(Link *head,Link *newnode)
{
(*newnode)->next = (*head)->next;
(*head)->next->prior = *newnode;
(*head)->next = *newnode;
(*newnode)->prior = *head;
}
void insert_tail_node(Link *head,Link *newnode)
{
(*head)->prior->next = *newnode;
(*newnode)->prior = (*head)->prior;
(*head)->prior = *newnode;
(*newnode)->next = *head;
}
void display_link(Link *head)
{
Link temp = (*head)->next;
while(temp != *head)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
void insert_mid_node(int num,Link *head,Link *newnode)
{
Link temp = (*head)->next;
while(temp != *head)
{
if(temp->num == num)
{
temp->next->prior = *newnode;
(*newnode)->next = temp->next;
(*newnode)->prior = temp;
temp->next = *newnode;
}
temp = temp->next;
}
}
void del_node(int num,Link *head)
{
Link temp = (*head)->next;
Link ptr = temp;
while(temp != *head)
{
if(temp->num == num)
{
ptr->next = temp->next;
temp->next->prior = ptr;
}
ptr = temp;
temp = temp->next;
}
}
int main()
{
int i;
Link head;
Link newnode;
creat_link(&head);
for(i = 0 ; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if(newnode == NULL)
{
printf("malloc error!\n");
exit(1);
}
else
{
newnode->num = i + 1;
//insert_head_node(&head,&newnode);
insert_tail_node(&head,&newnode);
}
}
display_link(&head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
//insert_mid_node(5,&head,&newnode);
//display_link(&head);
//del_node(5,&head);
//display_link(&head);
return 0;
}
链表逆序:
#include <stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node* Link;
void creat_head(Link *head)
{
*head = NULL;
}
void insert_head_link(Link *head,Link *newnode)
{
(*newnode)->next = *head;
*head = *newnode;
}
int link_display(Link *head)
{
if(*head == NULL)
{
printf("link empty!\n");
return -1;
}
else
{
Link temp = *head;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
}
void insert_tail_link(Link *head,Link *newnode)
{
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 link_reverse(Link *head)
{
if(*head == NULL || (*head)->next == NULL)
{
printf("error!\n");
return -1;
}
else
{
Link ptr;
Link ktr;
Link temp;
ptr = *head;
ktr = ptr->next;
temp = ktr->next;
while(temp != NULL)
{
ktr->next = ptr;
ptr = ktr;
ktr = temp;
temp = temp->next;
}
ktr->next = ptr;
(*head)->next = NULL;
*head = ktr;
}
}
int main()
{
int i;
Link head;
Link newnode;
creat_head(&head);
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if(newnode == NULL)
{
printf("malloc error!\n");
exit(1);
}
else
{
newnode->num = i + 1;
//insert_head_link(&head,&newnode);
insert_tail_link(&head,&newnode);
}
}
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
link_display(&head);
printf("\n");
link_reverse(&head);
link_display(&head);
printf("\n");
return 0;
}
头插和尾插(1):
#include <stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node* Link;
void creat_link(Link *head)
{
*head = (Link)malloc(sizeof(Node));
(*head)->next = NULL;
}
void insert_head_link(Link *head,Link *newnode)
{
(*newnode)->next = (*head)->next;
(*head)->next = *newnode;
}
void display_head_link(Link *head)
{
Link temp = (*head)->next;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
void insert_tail_link(Link *head,Link *newnode)
{
Link temp = *head;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = *newnode;
(*newnode)->next = NULL;
}
void insert_mid_nod(int num,Link *head,Link *newnode)
{
Link temp = *head;
while(temp->next !=NULL)
{
if(temp->num == num)
{
(*newnode)->next = temp->next;
temp->next = *newnode;
}
temp = temp->next;
}
}
void del_nod(int num,Link *head)
{
Link temp = *head;
Link ptr = temp;
while(temp->next != NULL)
{
//temp = temp->next;
if(temp->num == num)
{
ptr->next = temp->next;
}
ptr = temp;
temp = temp->next;
}
}
int link_reverse(Link *head)
{
if((*head)->next == NULL || (*head)->next->next == NULL)
{
return -1;
}
else
{
Link ptr = *head;
Link ktr = ptr->next;
Link temp = ktr->next;
while(temp != NULL)
{
ktr->next = ptr;
ptr = ktr;
ktr = temp;
temp = temp->next;
}
ktr->next = ptr;
(*head)->next->next = NULL;
(*head)->next = ktr;
}
}
int main()
{
int i;
Link head;
Link newnode;
creat_link(&head);
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if(newnode == NULL)
{
printf("malloc erroe!\n");
exit(1);
}
else
{
newnode->num = i + 1;
//insert_head_link(&head,&newnode);
insert_tail_link(&head,&newnode);
}
}
display_head_link(&head);
newnode = (Link)malloc(sizeof(Node));
newnode->num = 11;
insert_mid_nod(5,&head,&newnode);
//display_head_link(&head);
del_nod(5,&head);
//display_head_link(&head);
link_reverse(&head);
display_head_link(&head);
return 0;
}
头插和尾插(2):
#include <stdio.h>
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node* Link;
void insert_head_node(Link *head,Link *newnode)
{
(*newnode)->next = *head;
*head = *newnode;
}
void insert_tail_node(Link *head,Link *newnode)
{
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;
}
}
void creat_head(Link *head)
{
*head = NULL;
}
int link_print(Link *head)
{
if(*head == NULL)
{
return -1;
}
Link temp = *head;
while(temp != NULL)
{
printf("%d\n",temp->num);
temp = temp->next;
}
}
int insert_mid_node(int num,Link *head,Link *newnode)
{
if(*head == NULL)
{
return -1;
}
else
{
Link temp = *head;
while(temp != NULL)
{
if(temp->num == num)
{
(*newnode)->next = temp->next;
temp->next = *newnode;
}
temp = temp->next;
}
return -1;
}
}
int del_node(int num, Link *head)
{
if(*head == NULL)
{
return -1;
}
Link temp = *head;
if((*head)->num == num)
{
*head = (*head)->next;
}
else
{
Link ptr = temp;
temp = temp->next;
while(temp != NULL)
{
if(temp->num == num)
{
ptr->next = temp->next;
}
ptr = temp;
temp = temp->next;
}
return 1;
}
}
int main()
{
int i;
Link head;
Link newnode;
creat_head(&head);
for(i = 0; i < 10; i++)
{
newnode = (Link)malloc(sizeof(Node));
if(newnode == NULL)
{
printf("malloc error!\n");
}
else
{
newnode->num = i + 1;
//insert_head_node(&head,&newnode);//头叉
insert_tail_node(&head,&newnode);//尾叉
}
}
newnode = (Link)malloc(sizeof(Node));
newnode->num = 10;
del_node(5,&head);//删除节点
insert_mid_node(5,&head,&newnode);//插入节点
link_print(&head);//遍历链表
return 0;
}