#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct Linked_list//创建链表结构体
{
int data;
Linked_list *next;
}Linked_list;
Linked_list* Linked_list_initialization(int n)//创建n个元素的链表并初始化
{
if (n == 0)
return 0;
Linked_list* head = 0;
Linked_list* middle;
Linked_list* tail = NULL;
for (int i = 0; i < n; i++)
{
middle = (Linked_list*)malloc(sizeof(Linked_list));
if (i == 0)
head = middle;
middle->data = i;
middle->next = head;
if (0 < i)
tail->next = middle;
tail = middle;
}
return head;
}
void Print_the_linked_list(Linked_list* p)//打印n个链表的所有元素
{
if (!p)
{
return;
}
Linked_list* a = p;
do
{
if (a == p->next)
{
printf("%d,\n", p->data);
return;
}
printf("%d,", p->data);
p = p->next;
} while (1);
}
void Plug_in_and_out(Linked_list* p)//任意插法
{
int a;
printf("请输入 要插入在第几个节点的后面->:");
scanf_s("%d", &a);
for (int i = 0; i < a - 1; i++)
{
p = p->next;
}
if (!p)
{
return;
}
Linked_list* middle = (Linked_list*)malloc(sizeof(Linked_list));
printf("输入你要插入结点里元素的数值->:");
scanf_s("%d", &a);
middle->data = a;
middle->next = p->next;
p->next = middle;
}
void Head_plug(Linked_list** p)//头插法
{
Linked_list* b = *p;
int a;
Linked_list* head = 0;
head = (Linked_list*)malloc(sizeof(Linked_list));
printf("输入你要插入头结点里元素的数值->:");
scanf_s("%d", &a);
head->data = a;
head->next = *p;
while (!((*p)->next == b))
{
(*p) = (*p)->next;
}
(*p)->next = head;
*p = head;
}
void Tail_plug(Linked_list* p)//尾插法
{
Linked_list* b = p;
int a;
Linked_list* tail = 0;
tail = (Linked_list*)malloc(sizeof(Linked_list));
printf("输入你要插入头结点里元素的数值->:");
scanf_s("%d", &a);
tail->data = a;
tail->next = p;
while (!((p)->next == b))
{
(p) = (p)->next;
}
p->next = tail;
}
void Connected(Linked_list* p1, Linked_list* p2)//联合两个单循环链表
{
Linked_list* a = p1;
Linked_list* b = p2;
while (!(p1->next == a))
{
p1 = p1->next;
}
p1->next = p2;
while (!(p2->next == b))
{
p2 = p2->next;
}
p2->next = a;
}
void DEL(Linked_list* p)
{
int a;
printf("请输入你要删除的第几个元素。\n");
scanf_s("%d", &a);
for (int i = 0; i < a - 2; i++)
{
p = p->next;
}
Linked_list* tmp = p->next;
p->next = p->next->next;
free(tmp);
printf("删除完成。\n");
}
int main()
{
Linked_list* s1 = Linked_list_initialization(1);//创建n个元素的链表并初始化
Linked_list* s2 = Linked_list_initialization(2);//创建n个元素的链表并初始化
printf("打印链表s1里的所有元素。\n");
Print_the_linked_list(s1);//打印n个链表的所有元素
printf("打印链表s2里的所有元素。\n");
Print_the_linked_list(s2);//打印n个链表的所有元素
printf("将链表s1与链表s2 合为一个链表。\n");
Connected(s1, s2);
printf("打印合成后的链表。\n");
Print_the_linked_list(s1);//打印n个链表的所有元素
printf("在循环单向链表 头结点处增加一个元素。\n");
Head_plug(&s1);//头插法
printf("打印循环单向链表。\n");
Print_the_linked_list(s1);//打印n个链表的所有元素
printf("再循环单向链表 尾结点处增加一个元素。\n");
Tail_plug(s1);//尾插法
Print_the_linked_list(s1);//打印n个链表的所有元素
printf("再循环单向链表 任意位置插入元素。\n");
Plug_in_and_out(s1);//任意插法
Print_the_linked_list(s1);//打印n个链表的所有元素
DEL(s1);//
Print_the_linked_list(s1);//打印n个链表的所有元素
return 0;
}
循环单链表的 初始化,头插法,尾插法,任意插法,以及打印出链表的所有元素的实现方法。
于 2022-03-30 13:35:08 首次发布