在一个有序(按非递减顺序)的链表中插入一个元素为x的结点,使插入后的链表仍然有序(链表数据域为整型数,初始时输入6个元素)。

【链表】

算是自己写的第一个百行代码了!纪念!

在一个有序(按非递减顺序)的链表中插入一个元素为x的结点,使插入后的链表仍然有序(链表数据域为整型数,初始时输入6个元素)。

程序运行示例如下:

输入数组6个元素的值。

12 23 34 45 56 67

此链表各个结点的数据域为:12 23 34 45 56 67

输入要插入的数据x:36

插入后链表各个结点的数据域为:12 23 34 36 45 56 67

Talk is cheap, show me the code.

/*
在一个有序(按非递减顺序)的链表中插入一个元素为x的结点,
使插入后的链表仍然有序(链表数据域为整型数,初始时输入6个元素)。
程序运行示例如下:
输入数组6个元素的值。
12 23 34 45 56 67
此链表各个结点的数据域为:12 23 34 45 56 67 
输入要插入的数据x:36
插入后链表各个结点的数据域为:12 23 34 36 45 56 67 
*/

#include <stdio.h>
#include <stdlib.h>

struct num                                  //1.准备工作-结构体定义
{
    
                                               //结构体包含:
	int a;                                  //①数据
	struct num *pNext;                      //②指针
};

#define SIZE sizeof(struct num)             //2.宏定义SIZE, 方便后续分配内存

struct num *CreatLiList(void)               //3.函数-返回结构体指针-建立链表
{
    
    
	struct num *spHead,*spPre,*spCur;       //头, 前, 现
	int n, count = 0;                      
	spPre  = (struct num *)malloc(SIZE);    //给Pre分配内存
	spHead = spPre;                         //Head指向Pre
	spHead -> pNext = NULL;                 //头结点中的②指针指向NULL
    
	do 
	{
    
    
		scanf("%d",&n);                     //输入数据
		if (count != 6)                     //结束标志
		{
    
    
            count ++;
			spCur = (struct num *)malloc(SIZE);  //给Cur分配内存

			spCur -> a = n;                      //赋予Cur①数据

			spCur -> pNext = NULL;               //Cur②指针指向NULL

			spPre -> pNext = spCur;              //Cur移到下一个
			spPre = spCur;                       //Pre移到Cur
		}
	} while (count != 6);                        //结束标志
	return spHead;                               //返回头节点, 成功创建链表
}


int AddNode(struct num *sp, int x)                   //函数-插入节点-传入头结点、插入数据
{
    
    
	struct num *spCur,*spNew;
	spCur = sp;
    int flag = 1;
	while((spCur -> pNext)->a < x)
	{
    
    
	    spCur = spCur -> pNext; 	
	}                                                //退出循环时,x 要插入Cur 与 Cur->next 之间

	spNew = (struct num *)malloc(SIZE);
	if (spNew == NULL)  return 1;
	
	spNew -> a = x;                                  //赋值
                                                     //e.g. 原来a→c,加入b后,a→b→c
    spNew -> pNext = spCur -> pNext ;                //让b→的 指向 a→的
    spCur -> pNext = spNew;                          //把a→的 改为 b
	
	
    return 1;
}



void TraverLiList(struct num *sp)                 //函数-遍历链表-传入头结点
{
    
    
	struct num *spCur;
	spCur = sp -> pNext;
	while (spCur != NULL)
	{
    
    
		printf("%d ", spCur->a);
		spCur = spCur -> pNext;
	}
}

int main()
{
    
    
	printf("输入数组6个元素的值。\n");
    struct num* head = CreatLiList();
    printf("此链表各个结点的数据域为:");
    TraverLiList(head); 
	printf("\n");
    int x;
    printf("输入要插入的数据x:");
    scanf("%d", &x);
    int i = AddNode(head, x);
    printf("插入后链表各个结点的数据域为:");
    TraverLiList(head); 
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_51366188/article/details/110691424