问题描述
设计算法,实现单链表的删除和插入操作。
输入描述
输入共三行,
第一行输入由空格分隔的若干个整数(以9999结束),表示单链表的元素,9999不算单链表的元素,利用尾插法建立单链表;
第二行一个整数i,代表删除元素的位置,完成单链表的删除操作;
第三行有两个整数j和k,分别代表插入元素的位置和待插入的元素,完成单链表的插入操作。
输出描述
输出有3-5行,第一行输出建立的单链表中所有元素,元素之间用一个空格隔开;
第二行输出删除是否成功,即输出“删除成功!”或“删除失败!”,若删除成功,则在下一行输出删除元素后的单链表,若删除失败,则不输出;
下一行输出插入是否成功,即输出“插入成功!”或“插入失败!”,若插入成功,则在下一行输出插入元素后的单链表,若插入失败,则不输出。
样例输入
输入样例1: 1 2 3 4 5 6 7 8 9 9999 2 5 16 输入样例2: 1 2 3 4 5 6 7 8 9 9999 -2 15 16
样例输出
输出样例1: 建立的单链表为:1 2 3 4 5 6 7 8 9 删除成功! 删除元素后的单链表为:1 3 4 5 6 7 8 9 插入成功! 插入元素后的单链表为:1 3 4 5 16 6 7 8 9 输出样例2: 建立的单链表为:1 2 3 4 5 6 7 8 9 删除失败! 插入失败!
#include<stdio.h>
#define LISTSIZE 100
typedef int DataType;
typedef struct
{
DataType data[LISTSIZE];
int length;
}SeqList;
static void ListDelete(SeqList& L, int i) //单链表的删除操作
{
if (i<1 || i>L.length) //检查删除位置是否合法
{
printf("删除失败!\n");
return;
}
else
{
for (int k = i; k < L.length - 1; k++)
L.data[k - 1] = L.data[k];
L.length--;
printf("删除成功!\n");
}
printf("删除元素后的单链表为:");
for (int k = 0; k < L.length - 1; k++)
printf("%d ", L.data[k]);
printf("\n");
return;
}
static void ListInsert(SeqList& L, int j, int k) //单链表的插入操作
{
if (j<1 || j>L.length) //检查合法性
{
printf("插入失败!\n");
return;
}
else
{
L.length++; //单链表长度加一
int a = j; //标记插入位置
//插入位置之后所有元素后移一位
int b=L.length-1;
while (b>j-1) //前一个元素的值赋给后一个元素
{
L.data[b] = L.data[b - 1];
b--;
}
L.data[a-1] = k;
printf("插入成功!\n");
}
printf("插入元素后的单链表为:");
for (int k = 0; k < L.length - 1; k++)
printf("%d ", L.data[k]);
return;
}
int main()
{
SeqList L;
int n = 0; //计算元素个数
do{
scanf("%d", &L.data[n]);
n++;
} while (L.data[n-1] != 9999);
L.length = n; //将元素个数赋值给单链表长度
int i = 0;
scanf("%d", &i); //删除元素的位置
int j = 0, k = 0;
scanf("%d%d", &j, &k); //插入元素的位置和待插入的元素
printf("建立的单链表为:");
for (int m = 0; m < L.length - 1; m++)
printf("%d ", L.data[m]);
printf("\n");
ListDelete(L, i); //删除操作
ListInsert(L, j, k); //插入操作
return 0;
}