不带头结点的单链表的基本操作
不带头结点的单链表的基本操作 初始化、 插入(头插法,尾插法)、删除、逆置、合并(递归、非递归)、排序、遍历
/*
*
不带头结点的单链表的基本操作
初始化、 插入(头插法,尾插法)、删除、
逆置、合并(递归、非递归)、排序、遍历
*
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node, *Linklist;
void init(Node **head)
{
*head=NULL;
}
void insert_head(Node **head, int num)
{
Node *p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
printf("malloc failed..\n");
return ;
}
p->data = num;
p->next = *head;
*head = p;
}
void insert_tail(Node **head, int num)
{
Node *p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
printf("malloc failed..\n");
return ;
}
p->data = num;
p->next = NULL;
Node *q = *head;
if(NULL==q) //if the node is the first node
{
*head = p;
}
else
{
while(q->next!= NULL) //move the pointer to the last position
{
q = q->next;
}
q->next = p;
}
}
void linklist_delete(Node **head, int num) //巧妙的利用了二级指针
{
if(NULL == *head || NULL == head) return ;
Node** cur = head;
Node *entry = NULL;
while(*cur != NULL)
{
entry = *cur; //备份当前结点
if(entry->data == num)
{
*cur = entry->next;
free(entry);
//break; //不删除其他data域相同的结点
}
else
{
cur = &(entry->next); //保存指向entry->next域的地址
}
}
}
void reverse(Node **head)
{
if(NULL==head)
{
return ;
}
Node *p, *q, *cur;
p = *head;
cur = (*head)->next;
while(cur!=NULL)
{
q = cur->next;
cur->next = p;
p = cur;
cur = q;
}
(*head)->next = NULL;
*head = p;
}
Node *merge(Node *head1, Node *head2)
{
if(NULL == head1)
{
return head2;
}
if(NULL == head2)
{
return head1;
}
Node *h = NULL;
Node *p1= head1, *p2 = head2;
if(p1->data <= p2->data)
{
h = head1;
h->next = merge(p1->next, p2);
}
else
{
h = head2;
h->next = merge(p1, p2->next);
}
return h;
}
Node *merge_list(Node *head1, Node *head2)
{
if(NULL == head1)
{
return head2;
}
if(NULL == head2)
{
return head1;
}
Node *h = NULL, *p = NULL;
if(head1->data < head2->data)
{
h = p = head1;
head1 = head1->next;
}
else
{
h = p = head2;
head1 = head2->next;
}
while(head1!=NULL && head2!=NULL)
{
if(head1->data < head2->data)
{
p->next = head1;
p = head1;
head1 = head1->next;
}
else
{
p->next = head2;
p = head2;
head2 = head2->next;
}
}
if(head1!=NULL)
{
p->next = head1;
}
else if(head2!=NULL)
{
p->next = head2;
}
return h;
}
void sort(Node **head)
{
int i=0, j=0, tt=0;
int count = 0;
if(NULL==*head || NULL == (*head)->next)
{
return ;
}
Node *p = *head;
Node *q = p->next;
while(q!=NULL)
{
count++;
q = q->next;
}
for(i=0; i<count; i++)
{
p = *head;
q = p->next;
for(j=0; j<count-i; j++)
{
if(p->data > q->data)
{
tt = p->data;
p->data = q->data;
q->data = tt;
}
p = p->next;
q = q->next;
}
}
}
void traverse(Node *head)
{
if(NULL == head)
{
return ;
}
Node *p = head;
while(p!=NULL)
{
printf(" %d", p->data);
p = p->next;
}
}
int main()
{
Node *head1;
Node *head2;
Node *t;
int i=0;
printf("create linklist1(head_insert) \n");
init(&head1);
for(i=0; i<10; i=i+2)
insert_head(&head1, i);
traverse(head1);
printf("\n");
printf("reverse linklist1 \n");
reverse(&head1);
traverse(head1);
printf("\n");
printf("create linklist2(tail_insert) \n");
init(&head2);
for(i=9; i>0; i=i-2)
insert_tail(&head2, i);
insert_tail(&head2, 8);
traverse(head2);
printf("\n");
printf("sort linklist2 \n");
sort(&head2);
traverse(head2);
printf("\n");
printf("linklist merge \n");
//t = merge(head1, head2);
t = merge_list(head1, head2);
traverse(t);
printf("\n");
printf("delete node (data=8) \n");
linklist_delete(&head1, 8);
traverse(head1);
printf("\n");
return 0;
}