数据结构之单向循环链表和双向循环链表
对于很多初学者来说,最头疼的事情莫过于不知道如何下手,俗话说的好:万事开头难。写代码就是不断的仿照别人的代码,根据自己的思路加以理解,最后形成一种编程思想。编程的路上是很艰辛的,应该说,这个世界上学什么都是很艰辛的,只要你坚持下去,总有一天你会成为大神级别,等待的只是时间问题,和你的背后付出。好了,说正题,下面是我整理的一些数据结构中的单向循环链表和双向循环链表
第一章节:单向循环链表
第二章节:双向循环链表
#include
#include
#include
//初始化空链表
typedef struct node
{
int data;
struct node *next;
}listnode, *list;
//判断链表是否为空
bool is_empty(list head)
{
return head->next == NULL;
}
//初始化一个带头节点的链表
list init_list(void)
{
list mylist = malloc(sizeof(listnode)); //创建一个头节点
mylist->next = mylist; //单向循环链表指向头节点 mylist->next = mylist;
//单向链表指向 NULL mylist->next = NULL;
return mylist;
}
//创建新节点
list creat_node(int data)
{
list new = malloc(sizeof(listnode));
if(new != NULL)
{
new->data = data;
new->next = new; //暂时没有插入链表里
}
return new;
}
//插入节点
void insert_head(list mylist, int data)
{
list new_node = creat_node(data);
list p = mylist;
if(p == NULL || new_node == NULL)
return;
new_node->next = p->next;
p->next = new_node;
}
//查找节点
list find_node(list mylist, int data)
{
list p = mylist;
while(p->next != mylist)
{
if(p->next->data == data)
{
return p->next;
}
p = p->next;
}
}
//删除节点
bool remove_node(list mylist, int data)
{
if(is_empty(mylist)) //如果链表为空,则返回false
return false;
list p = mylist;
list q;
while(p->next != mylist)
{
if((p->next)->data == data)
{
q = p->next;
p->next = p->next->next;
q->next = NULL;
free(q);
//当最后面的节点是我们要删除的时候
if(p->next == mylist)
break;
}
p = p->next;
}
}
//遍历显示链表
void show(list mylist)
{
if(is_empty(mylist))
return;
list p = mylist;
while(p->next != mylist)
{
p = p->next;
printf("%d\t", p->data);
}
printf("\n");
}
int main(int argc, char **argv)
{
list mylist = init_list();
if(mylist == NULL)
{
printf("创建失败!");
exit(1);
}
int n;
while(1)
{
int ret = scanf("%d", &n);
if(ret != 1)
{
break;
}
//创建一个新的节点
list new = creat_node(n);
//将新的节点插入链表
insert_head(mylist, n);
//遍历
show(mylist);
}
//删除节点
remove_node(mylist, n);
show(mylist);
}#include
#include
#include
//初始化空链表 typedef struct node { int data; struct node *next; }listnode, *list; //判断链表是否为空 bool is_empty(list head) { return head->next == NULL; } //初始化一个带头节点的链表 list init_list(void) { list mylist = malloc(sizeof(listnode)); //创建一个头节点 if(mylist != NULL) { mylist->next = NULL; } return mylist; } //创建新节点 list creat_node(int data) { list new = malloc(sizeof(listnode)); if(new != NULL) { new->data = data; new->next = NULL; //暂时没有插入链表里 } return new; } //头插法插入节点:需要知道这个节点插入到哪一个节点P后面,需要有一个新节点 void insert_head(list mylist, int data) { list new_node = creat_node(data); list p = mylist; if(p == NULL || new_node == NULL) return; new_node->next = p->next; p->next = new_node; } //尾插法插入节点:需要知道这个节点插入到哪一个节点P后面,需要有一个新节点 void insert_tail(list mylist, int data) { list new_node = creat_node(data); list p = mylist; while(p->next != NULL) { p = p->next; } p->next = new_node; } //查找节点 list find_node(list mylist, int data) { list p = mylist; while(p->next != NULL) { if(p->next->data == data) { return p->next; } p = p->next; } } //删除节点 bool remove_node(list mylist, int data) { if(is_empty(mylist)) //如果链表为空,则返回false return false; list p = mylist; while(p->next != NULL) { if((p->next)->data == data) { list q = p->next; p->next = p->next->next; q->next = NULL; free(q); //当最后面的节点是我们要删除的时候 if(p->next == NULL) break; } p = p->next; } } //遍历显示链表 void show(list mylist) { if(is_empty(mylist)) return; list p = mylist; while(p->next != NULL) { p = p->next; printf("%d\t", p->data); } printf("\n"); } int main(int argc, char **argv) { list mylist = init_list(); if(mylist == NULL) { printf("创建失败!"); exit(1); } //判断是否为空链表‘ bool y = is_empty(mylist); if(y == true) { printf("则此链表为空链表!"); } int i; //头插法 for(i = 0;i < 5;i++) { insert_tail(mylist, i); } //遍历显示链表 show(mylist); printf("===========================\n"); //删除节点 remove_node(mylist, 1); show(mylist); }