typedef struct Node
{
int date;
struct Node *next;
}node;
//链表的初始化
void Init(node **head)
{
if (*head != NULL)
{
node * p = (node*)malloc(sizeof(node));
p->next = NULL;
(*head) = p;
}
}
//创建头插法
void create_from_head(node *head)
{
if (head != NULL)
{
int date = 0;
scanf("%d", &date);
while (-1 != date)
{
node *p = (node *)malloc(sizeof(node));
p->date = date;
p->next = head->next;
head->next = p;
scanf("%d", &date);
}
}
}
//尾插法
void create_from_tail(node *head)
{
if (head != NULL)
{
int date = 0;
scanf("%d", &date);
node *q = head;
while (-1 != date)
{
node *p = (node*)malloc(sizeof(node));
p->date = date;
q->next = p;
q = q->next;
scanf("%d", &date);
}
q->next = NULL;
}
}
//插入
int insert(node *head,int insert_date,int pre)//在pre之前插入insert_date
{
if (head != NULL)
{
node *p = (node *)malloc(sizeof(node));
p = head->next;
while (p)
{
if (p->next->date == pre)
{
node *date = (node *)malloc(sizeof(node));
date->date = insert_date;
date->next = p->next;
p->next = date;
return 1;//成功
}
p = p->next;
}
}
return -1;//失败
}
//输出
void Printf(node *head)
{
if (head != NULL)
{
node *p = head->next;
while (p)
{
printf("%d -> ", p->date);
p = p->next;
}
printf("\b\b\b\b");
printf(" ");
}
}
//删除节点
void delete_node(node *head,int date)
{
if (head != NULL)
{
node *p = (node*)malloc(sizeof(node));
p = head;
while (p->next)
{
if (p->next->date == date)
{
node *q = (node*)malloc(sizeof(node));
q = p->next;
p->next = p->next->next;
free(q);
}
p = p->next;
}
}
}
//将两个节点合并,并且使用原来提供的链表,但是会对原来的链表造成破坏。
void mermy(node *A, node *B)
{
if (A != NULL&&B != NULL)
{
node *C = A;;
node *pa = A->next;
node *pb = B->next;
while (pa&&pb)//同时不为空
{
if (pa->date < pb->date)
{
C->next = pa;
pa = pa->next;
}
else
{
C->next = pb;
pb = pb->next;
}
C = C->next;
}
if (pa)
{
C->next = pa;
}
if (pb)
{
C->next = pb;
}
}
}
//求长度
void Length(node *head,int &length)
{
if (head != NULL)
{
node *p = head->next;
while (p)
{
p = p->next;
length++;
}
}
}
//查找
node * search(node *head,int date)
{
node *result = (node*)malloc(sizeof(node));
result->date = -1;
if (head != NULL)
{
node *p = (node *)malloc(sizeof(node));
p = head->next;
while (p)
{
if (p->date == date)
{
result = p;
return result;//成功
}
p = p->next;
}
}
return result;//失败
}
//根据位置查找
node * search_site(node *head, int date)
{
node *result = (node*)malloc(sizeof(node));
result->date = -1;
if (head != NULL)
{
node *p = (node *)malloc(sizeof(node));
p = head->next;
int i = 1;
while (p)
{
if (i == date)
{
result = p;
return result;//成功
}
p = p->next;
}
}
return result;//失败
}
int main(void)
{
#if 1
node *head;
//初始化
Init(&head);
//创建链表,头插法
create_from_head(head);
printf("\n");
Printf(head);
printf("\n");
//查找,按值
node *p = (node*)malloc(sizeof(node));
p = search(head,10);
printf("\n");
printf("%d",p->date);
printf("\n");
//查找,按位置
node *q = (node*)malloc(sizeof(node));
q = search_site(head, 1);
printf("\n");
printf("%d", q->date);
printf("\n");
//长度
int lenght = 0;
Length(head, lenght);
printf("%d\n", lenght);
#endif
#if 0
//创建链表,尾插法
node *head1;
Init(&head1);
create_from_tail(head1);
printf("\n");
Printf(head1);
printf("\n");
//插入,按值插入
insert(head1, 10,20);
printf("\n");
Printf(head1);
printf("\n");
//删除
delete_node(head1,10);
printf("\n");
Printf(head1);
printf("\n");
#endif
#if 0
//合并
node *head1;
node *head2;
Init(&head1);
create_from_tail(head1);
Init(&head2);
create_from_tail(head2);
mermy(head1,head2);
printf("\n");
Printf(head1);
printf("\n");
#endif
return 0;
}
单链表的简单操作
最新推荐文章于 2022-05-11 17:59:15 发布