您的位置:首页 > 理论基础 > 数据结构算法

C语言基础—数据结构之单向循环链表和双向循环链表

2017-09-20 12:46 543 查看

数据结构之单向循环链表和双向循环链表

对于很多初学者来说,最头疼的事情莫过于不知道如何下手,俗话说的好:万事开头难。写代码就是不断的仿照别人的代码,根据自己的思路加以理解,最后形成一种编程思想。编程的路上是很艰辛的,应该说,这个世界上学什么都是很艰辛的,只要你坚持下去,总有一天你会成为大神级别,等待的只是时间问题,和你的背后付出。好了,说正题,下面是我整理的一些数据结构中的单向循环链表和双向循环链表
第一章节:单向循环链表
第二章节:双向循环链表

#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐