题目:利用C或C++语言实现一个长度为N的int型单链表,包括链表的定义、建立、指定位置增减以及长度查询等操作。
#include<stdio.h>
#include<stdlib.h>
#define N 10
struct Link
{
int data;
struct Link *next;
};
int length = 0; // 用来存放链表长度
/**
* head: 数据链表
* index: 插入的位置
* data: 插入的数据
**/
struct Link *insertLink(Link *head, int index, int data) {
struct Link *p = NULL, *pr = head;
p = (struct Link*)malloc(sizeof(struct Link));
if (p == NULL)
{
printf("内存分配失败!\n");
exit(0);
}
p->data = data;
p->next = NULL;
if (index == 0) {// 首部插入即可
p->next = pr;
head = p;
}
else if (index == length - 1) {// 尾部插入
while (pr->next != NULL)
{
pr = pr->next;
}
pr->next = p;
}
else {// 中间插入
int index_temp = 0;// 循环计数
Link *pre = NULL;
while (index_temp != index)
{
index_temp++;
if (index_temp == index) pre = pr;
pr = pr->next;
}
pre->next = p;
p->next = pr;
}
length++;
return head;
}
/**
* head: 数据链表
* index: 删除的位置
**/
struct Link *deleteLink(Link *head, int index) {
if (length == 0) return head;
struct Link *p = head, *pr = head;// 快慢指针的思路
if (index == 0) {// 删除首个元素
pr = pr->next;
head = pr;
}
else {// 删除其它位置的元素
int index_temp = 0;// 循环计数
while (index_temp != index) {
if (index_temp > 0) p = p->next;
pr = pr->next;
index_temp++;
}
p->next = pr->next;
}
length--;
return head;
}
/**
* 获取用户输入的数字
* content: 用于控制台中提示的字符串
*/
int getInput(const char *content) {
int input = -1;
printf("%s", content);
scanf("%d", &input);
return input;
}
/**
* 展示链表所有数据
* head: 链表
**/
void showLink(Link *head) {
struct Link *p = head;
while (p != NULL)
{
printf("%d ->", p->data);
p = p->next;
}
printf("\n");// 换行
}
// 新增数据 - 逻辑代码
struct Link *stepOne(Link *head) {
int index = getInput("请输入要插入的位置(负数默认插入在首部,大于链表长度则插入到尾部,规则与数组索引相似):\n");
int data = getInput("请输入要插入的数据:\n");
if (index < 0 || length == 0) {
// 插入到首部
head = insertLink(head, 0, data);
}
else if (index >= length - 1) {
// 插入到尾部
head = insertLink(head , length, data);
}
else {
// 插入到 index 位置
head = insertLink(head, index, data);
}
printf("-------------------------------------------------------------------------------------\n");
return head;
}
// 删除数据 - 逻辑代码
struct Link *stepTwo(Link *head) {
int index = getInput("请输入要删除的位置(负数默认删除首个元素,大于链表长度则删除尾部):\n");
if (index < 0) {
head = deleteLink(head, 0);
}
else if (index >= length - 1) {
head = deleteLink(head, length - 1);
}
else {
head = deleteLink(head, index);
}
printf("-------------------------------------------------------------------------------------\n");
return head;
}
// 查看长度 - 逻辑代码
void stepThree(Link *head) {
printf("链表长度为: %d\n", length);
printf("-------------------------------------------------------------------------------------\n");
}
// 显示数据 - 逻辑代码
void stepFour(Link *head) {
showLink(head);
printf("-------------------------------------------------------------------------------------\n");
}
// 主函数 - 流程代码
int main() {
struct Link *head = NULL;
const char *menuContent = "请输入数字来选择下列选项:\n1.新增数据\t2.删除数据\t3.查看链表长度\t4.显示链表数据\t5.结束程序\n";
while (1) {
int input = getInput(menuContent);
switch (input)
{
case 1:
printf("选择了新增数据\n");
head = stepOne(head);
break;
case 2:
printf("选择了删除数据\n");
head = stepTwo(head);
break;
case 3:
stepThree(head);
break;
case 4:
stepFour(head);
break;
case 5:
return 0;
default:
break;
}
}
return 0;
}
有任何bug或者建议请评论区留言~