设计算法,接受两个链表结点作为参数,将第二个结点插入链表并使之成为第一个结点的后继结点(如果两个参数为空则什么都不做)。
(1)从键盘输入数据,以$结束,建立链表。
(2)从键盘输入2个数据,将第二个结点插入链表并使之成为第一个结点的后继结点。
(3)输出链表所有结点值,观察输出结果。
(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
//请在此填写数据类型说明
typedef struct Node
{
char data;
struct Node *next;
}Node, *LinkList;
int menu_select() //菜单驱动程序
{
int sn; //sn用于接收菜单选项
printf("\n单链表的插入\n"); //显示菜单
printf("==============================\n");
printf("1、从键盘输入数据,以$结束,建立链表\n");
printf("2、从键盘输入数据,将第二个结点插入链表并使之成为第一个节点的后继结点\n");
printf("3、输出链表所有结点值,观察输出结果\n");
printf("0、退出\n");
printf("==============================\n");
printf("请选择0--3:");
for(;;) //菜单功能选择
{
scanf("%d",&sn);
getchar();
if(sn<0 || sn>3) //判断菜单选项是否属于合理范围:0--3
printf("\n\t 输入选择错误,请重新选择 0--3: ");
else
break;
}
return sn;
}
/*
TODO:创建一个链表。
在该函数中,获取键盘上输入的一个字符,直到遇到$符为止。
比如:键盘输入a回车 b回车 $回车后,创建出来的链表head值为:
head->next->data='a';
head->next->next->data='b';
head->next->next->next=NULL;
*/
void ListCreat_L(LinkList head)
{
char c;
Node *p;
p=(Node*)malloc(sizeof(Node));
p=head;
while((c=getchar())!='$')
{
Node *newnode;
newnode=(Node*)malloc(sizeof(Node));
newnode->next=NULL;
newnode->data=c;
p->next=newnode;
p=newnode;
}
}
/*
TODO:将链表中的元素值打印出来。
比如:head->next->data=a,head->next->next->data=3,则打印出来如下语句。
第1个元素是:a
第2个元素是:3
提示:打印语句可通过printf("第%d个元素是:%c\n",i,p->data);完成。
*/
void ListPrint_L(LinkList head)
{
Node *p;
p=(Node*)malloc(sizeof(Node));
p=head->next;
int i=1;
while(p)
{
printf("第%d个元素是:%c\n",i,p->data);
p=p->next;
i++;
}
}
/*
TODO:将元素e插入到链表head中的第i个位置。
比如:head原来是:head->next->data=1;head->next->next->data=2.
现在需要在第2个位置处,插入元素3.则插入之后,head变为
head->next->data=1;head->next->next->data=3.head->next->next->next->data=2.
特殊说明:
如果插入的位置i<=0,则执行打印语句printf("插入位置错误!\n");后,直接返回。
如果插入的位置i大于链表head中的已有元素个数+1,则执行打印语句printf("插入位置不合理!\n");后,直接返回。
也就是说,如果链表中目前只有1个元素,但要想在第3个位置插入一个元素,则打印插入位置不合理的信息。
*/
void ListInsert_L(LinkList head, int i, char e)
{
Node *p;
p=(Node*)malloc(sizeof(Node));
p->next=NULL;
p=head;
int num=1;
while(p)
{
p=p->next;
num++;
}
if(i<=0)
printf("插入位置错误!\n");
else if(i>num)
printf("插入位置不合理!\n");
else
p=head;
for(int j=1;j<i;j++)
{
p=p->next;
}
Node *newnode;
newnode=(Node*)malloc(sizeof(Node));
newnode->data=e;
newnode->next=p->next;
p->next=newnode;
}
int Getloc()
{
int i;
printf("请输入要插入的位置:");
scanf("%d",&i);
return i;
}
char Getchar()
{
char e;
printf("请输入要插入的数据:");
scanf("%c",&e);
return e;
}
void main()
{
//声明一个全局数据变量,并将其初始化
LinkList head;
head = (LinkList)malloc(sizeof(Node));
head->next = NULL;
for(;;) // 菜单驱动程序:无限循环菜单功能选择与调用相应功能函数,直到选择0 退出
{
switch(menu_select()) // 调用菜单函数,按返回值选择功能函数
{
case 1:
printf("1、从键盘输入数据,以$结束,建立链表\n");
//创建链表调用
ListCreat_L(head);
break;
case 2:
printf("2、从键盘输入两个数据,将第二个结点插入链表并使之成为第一个节点的后继结点\n");
//插入结点调用
ListInsert_L(head,Getloc(),Getchar());
break;
case 3:
printf("3、输出链表所有结点值,观察输出结果\n");
//输出链表调用
ListPrint_L(head);
break;
case 0:
printf("再见!\n"); //退出系统
free(head);
return;
} // switch语句结束
} // for循环结束
} // main()函数结束