/*
Create_input_LinkedList:创建一条从键盘上输入数据的整形数据链表
返回值:
返回的 首节点的地址
*/
struct Node *Create_input_LinkList()
{
// 创建首尾节点
struct Node *first = NULL; // 首节点指针
struct Node *last = NULL; // 尾节点指针
while (1)
{
// 获取数据
int d;
scanf("%d", &d);
if (d == 0)
break;
// 创建新的数据节点并赋值
struct Node *pnew = malloc(sizeof(*pnew));
pnew->data = d;
pnew->next = NULL;
// 把新的数据节点加入到链表
if (first == NULL && last == NULL)
{
first = last = pnew;
}
else
{
last->next = pnew;
last = pnew;
}
}
}
/*
Print_LinkedList:输出一条整型数据链表
@first: 指针,指向链表的首节点
返回值:
无
*/
// 打印链表
void Printf_ListLint(struct Node *p)
{
struct Node *first = p;
while (first != NULL)
{
printf("%d\n", first->data);
first = first->next;
}
}
/*
Create_input_LinkedList_front:用头插法的方式创建一条从键盘上输入数据的整形数据链表
返回值:
返回的 首节点的地址
*/
// 头插法
struct Node *Create_input_LinkedList_front_1()
{
struct Node *first = malloc(sizeof(*first));
int x;
printf("键盘输入一些元素:");
scanf("%d", &x);
while (x != 0)
{
struct Node *p = malloc(sizeof(*p));
p->data = x;
p->next = first->next;
first->next = p;
scanf("%d", &x);
}
return first;
}
/*
Insert_node_y:在first指向的链表中,查找节点值为x的节点,在其前面插入一个值为y的节点
如果没有则增加在最后,如果有多个则找第一个
返回值:
返回插入之后链表的首节点地址
*/
struct Node *Insert_node_y_1(struct Node *first, Elemtype x, Elemtype y)
{
struct Node *p = first;
while (p->data && p->next->data != x)
{
p = p->next;
}
struct Node *pnew = malloc(sizeof(*pnew));
pnew->data = y;
pnew->next = NULL;
if (!p->next)
{
p->next = pnew;
}
else
{
pnew->next = p->next;
p->next = pnew;
}
return first;
}
/*
Create_input_LinkedList_front:用头插法的方式创建一条从键盘上输入数据的整形数据链表
返回值:
返回的 首节点的地址
*/
struct Node *Create_input_LinkedList_front()
{
struct Node *first = NULL;
while (1)
{
int d;
scanf("%d", &d);
if (d == 0)
{
break;
}
创建新节点,赋值
struct Node *pnew = malloc(sizeof(*pnew));
pnew->data = d;
pnew->next = NULL;
// 头插法的方式加入到链表中
if (first == NULL) // 从无到有
{
first = pnew;
}
else
{
pnew->next = first;
first = pnew; // 更新首节点指针
}
}
return first;
}
/*
Insert_node_y:在first指向的链表中,查找节点值为x的节点,在其前面插入一个值为y的节点
如果没有则增加在最后,如果有多个则找第一个
返回值:
返回插入之后链表的首节点地址
*/
struct Node *Insert_node_y(struct Node *first, Elemtype x, Elemtype y)
{
// 创建新节点并赋值
struct Node *pnew = malloc(sizeof(*pnew));
pnew->data = y;
pnew->next = NULL;
// 查找
struct Node *p = first; // 遍历指针
struct Node *pre = NULL; // 指向p前面一个节点
while (p)
{
if (p->data == x)
break;
pre = p;
p = p->next;
}
// 根据分析结果执行不同的操作
if (p) // 找到
{
// 根据不同的位置执行不同的操作
if (p == first) // 找到的节点在开头
{
pnew->next = first;
first = pnew;
}
else
{
pnew->next = p;
pre->next = pnew;
}
}
else // 未找到
{
if (first == NULL)
{
first = pnew;
}
else
pre->next = pnew;
}
return first;
}
/*
Insert_node_y_behind_x:在first指向的链表中,查找节点值为x的节点,在其后面插入一个值为y的节点
如果没有则增加在最后,如果有多个则找第一个
返回值:
返回插入之后链表的首节点地址
*/
struct Node *Insert_node_y_behind_x(struct Node *first, Elemtype x, Elemtype y)
{
// 创建新节点并赋值
struct Node *pnew = malloc(sizeof(*pnew));
pnew->data = y;
pnew->next = NULL;
// 查找
struct Node *p = first; // 遍历指针
struct Node *pre = NULL; // 指向p前面一个节点
while (p)
{
if (p->data == x)
break;
pre = p;
p = p->next;
}
// 根据分析结果执行不同的操作
if (p) // 找到
{
pnew->next = p->next;
p->next = pnew;
}
else // 未找到
{
if (first == NULL)
{
first = pnew;
}
else
pre->next = pnew;
}
return first;
}
/*
Delete_x_node:在first指向的链表中,查找节点值为x的节点,将其删除
如果有多个则删除第一个
返回值:
返回删除之后链表的首节点地址
*/
struct Node *Delete_x_node(struct Node *first, Elemtype x)
{
// 查找节点值为x的节点
struct Node *p = first; // 遍历指针
struct Node *pre = NULL;
while (p)
{
if (p->data == x)
{
break;
}
pre = p;
p = p->next;
}
// 找到则删除
if (p)
{
// 删除操作
if (p == first) // 要删除的是首节点
{
first = first->next;
p->next = NULL;
free(p);
p = NULL;
}
else
{
pre->next = p->next;
p->next = NULL;
free(p);
p = NULL;
}
}
return first;
}
/*
Delete_all_x_node:在first指向的链表中,查找节点值为x的节点,将其删除
如果有多个则删除所有
返回值:
返回删除之后链表的首节点地址
*/
struct Node *Delete_all_x_node(struct Node *first, Elemtype x)
{
struct Node *p = first; // 遍历指针
struct Node *pre = NULL;
// 查找节点值为x的节点
while (p)
{
if (p->data == x)
{
// 删除操作
if (p == first) // 要删除的是首节点
{
first = first->next;
p->next = NULL;
free(p);
p = first;
}
else
{
pre->next = p->next;
p->next = NULL;
free(p);
p = pre->next;
}
}
else
{
pre = p;
p = p->next;
}
}
return first;
}
/*
Create_sort_LinkedList:从键盘上输入数据,创建一条升序的整型数据链表
返回值:
返回新链表的首节点地址
*/
struct Node *Create_sort_LinkedList()
{
struct Node *first = NULL; // 指向首节点
struct Node *last = NULL; // 指向尾节点
while (1)
{
int d;
scanf("%d", &d);
if (d == 0)
break;
// 创建新节点并赋值
struct Node *p = malloc(sizeof(*p));
p->data = d;
p->next = NULL;
// 把新节点增加到链表中
if (first == NULL && last == NULL) // 空链表
{
first = p;
last = p;
}
else // 非空链表
{
// 查找链表中第一个比我大的节点,找到的情况下在其前面增加新节点
// 1. 查找链表中第一个比我大的节点
struct Node *q = first;
struct Node *new = NULL;
while (q != NULL && q->data < d)
{
new = q;
q = q->next;
}
// 在其前面增加新节点
if (new == NULL) // 新节点比首节点小
{
p->next = first;
first = p;
}
else if (q == NULL) // 新节点比所有节点都大,尾插法
{
last->next = p;
last = p;
}
else // 中间插入
{
new->next = p;
p->next = q;
}
}
}
return first;
}
struct Node *Create_sort_LinkedList_1()
{
struct Node *first = NULL;
struct Node *last = NULL;
while (1)
{
int d;
scanf("%d", &d);
if (d == 0)
break;
// 创建新节点
struct Node *p = malloc(sizeof(*p));
p->data = d;
p->next = NULL;
// 加入到链表中
if (first == NULL && last == NULL)
{
first = p;
last = p;
}
else // 非空链表
{
if (first->data > d)
{
// 头插法
p->next = first;
first = p;
continue;
}
struct Node *pnew = first;
// 查找位置
while (pnew->next && pnew->data <= d)
{
pnew = pnew->next;
} // p.一定不为空
// 执行插入操作
p->next = pnew->next;
pnew->next = p;
}
}
return first;
}
单链表无头节点
最新推荐文章于 2024-07-13 08:21:27 发布