数据结构:单向链表
#include#include//实现一个简单的单向链表 (不带头节点的链表,只有一个头指针)
struct Node{
int val;
struct Node *next;
};
struct Node *head;
void create_list()
{
head = NULL;
return ;
}
/*参数1:value表示要插入的数据
返回值:0表示成功,-1表示失败
功能描述:插入链表,采用头插法
*/
int insert_list(int value)
{
//封装一个结点
struct Node *tmp = (struct Node*)malloc(sizeof(struct Node));
if(tmp == NULL)
return -1;
tmp->val = value;
tmp->next = NULL;
//将该结点插入到链表中(头插法)
if(head == NULL)
{//空链表
head = tmp;
}
else
{//非空链表
tmp->next = head;
head = tmp;
}
return 0;
}
void show_list()
{
struct Node *t;
for(t=head;t!=NULL;t=t->next)
{
printf("val:%d\n",t->val);
}
return ;
}
//删除指定位置的节点,返回值0表示成功,-1表示失败
int delete_node(int pos)
{
if(pos <= 0)
{
printf("iput param error....,must > 0\n");
return -1;
}
if(head == NULL)
{
printf("list is empty...\n");
return -1;
}
//删除的是第一个节点
if(pos == 1)
{
struct Node *p = head;
head = head->next;
free(p);
return 0;
}
//删除的不是第一个节点
struct Node *before;
struct Node *cur;
int i;
for(before=head,cur=head->next,i=2;(cur!=NULL)&&(i<=pos);++i,before=cur,cur=cur->next)
{
if(pos == i)
{
before->next = cur->next;
free(cur);
break;
}
}
return 0;
}
//判断链表中有没有环,返回0表示没有,返回1表示有
int is_circle_on_list()
{
struct Node *one;
struct Node *two;
if(head == NULL)
{
return 0;
}
//one=two=NULL;这种情况没有
for(one=head,two=head->next;(two!=NULL)||(one!=two);)
{
one = one->next;
two = two->next;
if(two != NULL)
two = two->next;
}
if(two == NULL)
return 0
return 1;
}
int main()
{
//创建一个空链表 (没有存放数据的链表)
create_list();
//插入链表
insert_list(10);
insert_list(20);
insert_list(30);
insert_list(40);
//遍历链表
show_list();
delete_node(2);
printf("after delete....\n");
show_list();
return 0;
}
网友评论