单链表的插入

设计算法,接受两个链表结点作为参数,将第二个结点插入链表并使之成为第一个结点的后继结点(如果两个参数为空则什么都不做)。

(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()函数结束

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值