上机目的
- 掌握单链表的定义和基本概念;
- 掌握单链表的各种操作;
- 学会利用单链表解决实际问题。
逻辑结构 | 存储结构 | 操作 | |
线性表 | 1顺序表(重点掌握) | 线性表的常用操作有: 1、初始化 2、清空 3、插入 4、删除 5、查找、遍历、排序(重点学习) | |
2链表 | 2.1单向链表(重点掌握) | ||
2.2单向循环链表 | |||
2.3双向链表 | |||
2.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=1;
printf("创建单链表:\n");
printf("输入的值为1到9之间的数,输入'0'结束\n");
r=head;
while (temp!=0) {
printf("请输入结点值: ");
fflush(stdin);
scanf("%d",&temp);
if((0<temp) && (temp<10)){
//<------将此处代码补充完整
p = (LNode *)malloc(sizeof (LNode));
p->data = temp;
p->next = NULL;
r->next = p;
r = p;
printf("%d插入节点成功\n",temp);
}
else {
temp=0;
printf("输入错误,输入的值应为1到9之间的数\n");
}
}
return head;
}
void OutPutLink(){ //打印单链表
LNode *p;
p=head;
printf("打印单链表:\n");
while(p->next!=NULL){
//<------将此处代码补充完整
printf("%d->", p->next->data);
p = p->next;
}
printf("NULL");
printf("\n");
}
void Insert(LNode *L){
int i,e;
printf("请输入插入位置:");
fflush(stdin);
scanf("%d",&i);
printf("请输入数据:");
fflush(stdin);
scanf("%d",&e);
int j=0;
LNode *p=L;
while( p &&(j<i-1) ){
//<------将此处代码补充完整
p = p->next;
j++;
}
if(!p ||(j>i-1))
printf("插入失败\n");
//<------将此处代码补充完整
else {
LNode* s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
s->data = e;
s->next = p->next;
p->next = s;
}
printf("插入成功\n");
}
void Delete(LNode *L){
int i;
printf("请输入删除位置:");
fflush(stdin);
scanf("%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;
printf("删除%d成功\n",del->data);
// 删除节点
free(del);
}
void main(){
int select,n,flag=1; //flag意思是标记,用来表示用户是否选择了1-4操作,如果不是就将flag设置为0,表示用户不选择继续操作,也就是退出程序
head=CreateHead(); //初始化单链表
menu();
while(flag==1){
printf("您选择的操作是:");
fflush(stdin); //清除键盘缓冲区,不然无法连续读取用户刚刚从键盘输入的字符,因为可能读取的是缓冲区以前保存的字符
scanf("%d",&select);
switch(select){ //根据用户的输入,调用前面写的子函数,完成单链表的3个功能
case 1: head=CreateNext();
printf("\n");
break; //break作用是跳出多分支选择,继续下一个循环
//<------将此处代码补充完整
case 2: OutPutLink();
printf("\n");
break; //break作用是跳出多分支选择,继续下一个循环
case 3:
Insert(head);
printf("\n");
break; //break作用是跳出多分支选择,继续下一个循环
case 4:
Delete(head);
printf("\n");
break; //break作用是跳出多分支选择,继续下一个循环
default:printf("您选择退出程序,欢迎下次光临!\n");
flag = 0;
}
}
printf("\n");
system("pause");
}