任务描述
编写一个简单的单向链表,实现对一组长度不定的有序整数的管理(查询、插入、修改、删除)。
编程要求
(1)创建一个单向链表,其结点包含值(number)和序号(xuhao)两个整型数据字段(序号从1开始递增,相邻两结点的序号相差1,下同), 输出该链表(按顺序从头部开始输出结点的值,相邻结点值之间用一个空格隔开,最后一个结点的值后不包含空格,下同);
(2)输入整数n,输出序号为n的结点的值;
(3)输入整数x,查找第1个值为x的结点,并输出其序号和值;
(4)插入结点: 输入整数 n和整数x,在原链表中序号为n的结点后插入值为x的新结点,然后输出该链表;
(5)删除结点: 输入整数 n,删除序号为 n 的结点,并输出该链表。
(6)对链表的任何修改操作,都必须保证操作后,链表中从第1个结点开始,序号始终是从1开始递增,相邻结点的序号值相差1.
(7)确保及时释放内存(例如,删除一个结点时,删除的结点的内存要及时释放),避免内存泄漏。
(8)充分地利用函数对程序功能进行合理划分与设计,提高程序的可维护性。
测试说明
测试输入
21 3 15 27 11 18 0 3 15 3 33 4
预期输出:
21 3 15 27 11 18 15 3 15 21 3 15 33 27 11 18 21 3 15 27 11 18
上面有关输入输出的解释如下 :
输入第一行:输入一串数据,中间用空格隔开,当输入为0时结束输入 。
输出第一行:将链表中的每个元素输出。
输入第二行:输入要查找的序号3
输出第二行:序号3对应的数据15
输入第三行:要查找的元素15
输出第三行:元素15对应的位置3 ,以及 15这个元素
输入第四行:第一个元素为要插入的位置前一个元素位置3,第二个元素为要插入的数据33
输入第五行:要删除的元素位置4
输出第五行:删除元素后的链表元素再次输出。
代码实现
// 编程完成下列任务
//(1)建立一个单链表 21 3 15 27 11 18,并输出该链表;
//(2)输入序号n,查找序号为n的结点,并输出;
//(3)输入值x,查找值为x的结点,并输出;
//(4)插入结点: 输入序号 n和值x。在序号为n的结点后插入x,并输出该链表;
//(5)删除结点: 输入序号 n,删除序号为 n 的结点,并输出该链表。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define LEN sizeof(struct Nmb)
//创建结点
typedef struct Nmb
{
int number;
int xuhao;
struct Nmb* next;
}Link;
//初始化链表(输入数据)
Link* Creat(const int n,const int *arr)
{
Link* head = NULL, * node = NULL, * end = NULL;
head = (Link*)malloc(LEN);
if (head == NULL)
{
printf("%s", strerror(errno));
return 0;
}
end = head;
for (int i = 1; i <= n; i++)
{
node = (Link*)malloc(LEN);
if (node == NULL)
{
printf("%s", strerror(errno));
return 0;
}
node->number = arr[i - 1];
node->xuhao = i;
end->next = node;
end = node;
}
end->next = NULL;
return head;
}
//输出链表
void Output(const Link* head)
{
int i=0;
while (head->next != NULL)
{
head = head->next;
printf("%d", head->number);
if(head->next != NULL)
printf(" ");
}
printf("\n");
}
//查找序号
int SreachS(const Link* head, const int n)
{
int det = 0;
while (head->next != NULL)
{
if (head->xuhao == n)
{
det = head->number;
break;
}
head = head->next;
}
return det;
}
//查找元素
void SearchN(const Link* head,const int n)
{
int detS = 0;
while (head->next != NULL)
{
if (head->number == n)
{
detS = head->xuhao;
break;
}
head = head->next;
}
printf("%d %d\n", detS, n);
}
//尾插元素
void Insert(Link* head,const int s,const int n)
{
Link* p = NULL;
p = (Link*)malloc(LEN);
if (p == NULL)
{
return;
}
while (head->next != NULL)
{
if (head->xuhao == s)
{
p->xuhao = s + 1;
p->number = n;
p->next = head->next;
head->next = p;
while (p->next != NULL)
{
p->xuhao += 1;
p = p->next;
}
break;
}
head = head->next;
}
}
//删除元素
void Delete(Link* head,const int n)
{
Link* det = NULL, * tmp = head;
int i = 0;
while (i < n && tmp->next != NULL)
{
det = tmp;
tmp = tmp->next;
i++;
}
if (tmp != NULL)
{
det->next = tmp->next;
free(tmp);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int arr[10] = { 0 };
int i = 0;
while (n)
{
arr[i] = n;
i++;
scanf("%d", &n);
}
Link* head = Creat(i, arr);
Output(head);
int S = 0;
scanf("%d", &S);
S = SreachS(head,S);
printf("%d\n", S);
int N = 0;
scanf("%d", &N);
SearchN(head, N);
int N1 = 0, S1 = 0;
scanf("%d %d", &S1, &N1);
Insert(head, S1, N1);
Output(head);
int S2 = 0;
scanf("%d", &S2);
Delete(head, S2);
Output(head);
return 0;
}