编写C程序,实现单链表的下列功能:
1、 从键盘输入一组数据,创建单链表;
2、 输出单链表;
3、 插入元素,给出插入成功或失败的信息;
4、删除元素,给出删除成功或失败的信息。
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode { //声明结构体用来描述单链表
int data; //单链表中结点的数据域
struct LNode* next; //单链表中结点的指针域
}LNode, * LinkList;
LNode* head;
void printStar() //连续输入几十个*,用来设计虚拟界面的边框
{
int i;
for (i = 0; i < 70; i++)
printf("*");
printf("\n");
}
void menu() //因为C语言无法创建可视化界面,因此这里创建一个虚拟的界面,方便用户操作
{
printStar();
printf("\t\t\t欢迎进入单链表操作界面!\n");
printf("请从键盘输入数字,完成对应的操作(1到4为有效操作,输入其他退出程序)\n");
printf("\t 1.创建单链表\n");
printf("\t 2.打印单链表\n");
printf("\t 3.插入结点\n");
printf("\t 4.删除结点\n");
printStar();
}
LNode* CreateHead() { //单链表的初始化操作
head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
return head;
}
LNode* CreateNext() { //创建单链表(尾插法)
LNode* p, * r;
int temp;
printf("创建单链表:\n");
printf("输入的值为1到9之间的数,输入'0'结束\n");
printf("请输入结点值: ");
fflush(stdin);
scanf_s("%d", &temp);
r = head;
while (temp != 0) {
if ((0 < temp) && (temp < 10)) {
p = (LinkList)malloc(sizeof(LNode));
p->data = temp;
p->next = NULL;
r->next = p;
r = p;
printf("请输入结点值:");
fflush(stdin);
scanf_s("%d", &temp);
}
else {
temp = 0;
printf("输入错误,输入的值应为1到9之间的数\n");
}
}
return head;
}
void OutPutLink() { //打印单链表
LNode* p;
p = head;
printf("打印单链表:\n");
while (p->next != NULL) {
p = p->next;
printf("%d->", p->data);
}
printf("NULL");
printf("\n");
}
void Insert(LNode* L) { //插入结点
int i, e;
printf("请输入插入位置:");
fflush(stdin);
scanf_s("%d", &i);
printf("请输入数据:");
fflush(stdin);
scanf_s("%d", &e);
int j = 0;
LNode* p = L;
while (p && (j < i - 1)) {
p = p->next;
j++;
}
if (!p || (j > i - 1))
printf("插入失败\n");
LNode* t = (LNode*)malloc(sizeof(LNode));
t->data = e;
t->next = p->next;
p->next = t;
printf("插入成功\n");
}
void Delete(LNode* L) { //删除结点
int i;
printf("请输入删除位置:");
fflush(stdin);
scanf_s("%d", &i);
int j = 0;
LNode* p = L;
LNode* del = NULL;
while ((p->next) && (j < i - 1)) {
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))
printf("删除失败\n"); //增强程序的健壮性
del = p->next;
p->next = del->next;
free(del);
printf("删除成功\n");
}
int main() {
int select, flag = 1;//flag意思是标记,用来表示用户是否选择了1-4操作,如果不是就将flag设置为0,表示用户不选择继续操作,也就是退出程序
head = CreateHead(); //初始化单链表
menu();
while (flag == 1) {
printf("您选择的操作是:");
fflush(stdin); //清除键盘缓冲区,不然无法连续读取用户刚刚从键盘输入的字符,因为可能读取的是缓冲区以前保存的字符
scanf_s("%d", &select);
switch (select) { //根据用户的输入,调用前面写的子函数,完成单链表的3个功能
case 1: head = CreateNext();
printf("\n");
break; //创建单链表
case 2: OutPutLink();
printf("\n");
break; //打印单链表
case 3: Insert(head);
printf("\n");
break; //插入结点
case 4: Delete(head);
printf("\n");
break; //删除结点
default:printf("您选择退出程序,欢迎下次光临!\n");
flag = 0;
}
}
printf("\n");
system("pause");
return 0;
}