Java教程

链表插入(线性表)

本文主要是介绍链表插入(线性表),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

刚接触链表,有点迷糊,昨天和前天看视频看博客拼拼凑凑学了创建链表打印链表和插入节点什么的,之前写的被注释在后面了,还是请教学姐修改了很多才勉强把这道题弄出来。

放代码:

 

#include<stdio.h>
#include<stdlib.h>   //提供malloc()和free()
#include<string.h>   //提供strcpy()等
struct Node
{
    int data;    //数据域
    struct Node* next; //指针域(指向节点的指针)
};
struct Node* head;
struct Node* newNode;
int main()
{
    void CreateLinkList();
    void DeleteListHead();
    void FindNode();
    void PrintLinkList();

    CreateLinkList();
    DeleteListHead();
    FindNode();
    PrintLinkList();
    return 0;
}

int n;
void CreateLinkList()//创建新链表
{
    scanf("%d",&n);//输入单链表的长度
    struct Node *q,*tail;

    for(int i=0; i<n; i++)
    {
        //q=new Node;
        q=(struct Node*)malloc(sizeof(struct Node));
        q->next=NULL;
        scanf("%d",&(q->data));
        /*
        分类讨论,头节点和其他节点
        */

        if(i==0){
            head=q;
            tail=q;
        }else{
            tail->next=q;
            tail=q;
        }

    }
}

void PrintLinkList()//打印修改后的链表
{
    struct Node *p;
    //p=head->next;
    p=head;
    while(p)
    {
        printf("%d ",p->data);
        p=p->next;//指针移动到下个元素的首地址
    }
    printf("\n");
}

void DeleteListHead()//删除第一个结点
{
    /*
      删除节点,不能直接newNode->next=NULL,除非放在head=head->next;后面,
      才不会影响head指针的指向
    */
    newNode = (struct Node*)malloc(sizeof(struct Node));//申请动态内存
    //newNode->data = head->data;
    newNode=head;
    head=head->next;//头的第二个节点变成新的头
    newNode->next=NULL;
    //free(newNode);//删除第一个结点
}

void FindNode()//遍历,插入第一个节点到适当位置
{
    struct Node *pCurrent = head;//定义一个辅助指针变量
    while(pCurrent!=NULL)
    {
        //分类讨论
        /*
          1、头节点比要插入节点数字大
          2、末尾节点比要插入节点大
          3、其他情况
        */
        if(head->data>newNode->data){
            newNode->next=head;
            head=newNode;
            break;
        }else if(pCurrent->next==NULL){
            pCurrent->next = newNode;
            break;
        }
        else if(newNode->data >= pCurrent->data&&newNode->data<=pCurrent->next->data)//插入
        {
            newNode->next = pCurrent->next;
            pCurrent->next = newNode;
            break;
        }
        pCurrent = pCurrent->next;
    }
}
/*
#include<stdio.h>				
#include<stdlib.h>			//提供malloc()和free()
#include<string.h>			//提供strcpy()等

struct Node
{
	int data;				//数据域
	struct Node* next;	//指针域(指向节点的指针)
};
struct Node* head;
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));//申请动态内存

void CreateLinkList(int n);
void DeleteListHead();
struct Node* FindNode();
void PrintLinkList(); 

int main()
{
	void CreateLinkList();
	void DeleteListHead();
    struct Node* FindNode();
    void PrintLinkList(); 
	return 0;
 } 

int n;
void CreateLinkList()//创建新链表 
{
	scanf("%d",&n);//输入单链表的长度
	struct Node *q,*tail;
	 
	 for(int i=0;i<n;i++)
	 {
	 	q=new Node;
	 	q->next=NULL;
	 	scanf("%d",&q->data);
		tail->next=q;
		tail=q; 
	 }
	 newNode = head;
	 newNode->next = NULL;
}

void PrintLinkList()//打印修改后的链表 
{
	struct Node *p;
	p=head->next;
	while(p)
	{
		printf("%d",p->data);
		p=p->next;//指针移动到下个元素的首地址 
	}
	printf("\n");
}

void DeleteListHead()//删除第一个结点 
{
	head=head->next;//头的第二个节点变成新的头
	free(newNode);//删除第一个结点 
}

struct Node* FindNode()//遍历,插入第一个节点到适当位置 
{
	struct Node *pCurrent = &head;//定义一个辅助指针变量
	for(int i=0;i<n;i++)
	{
		if(newNode > pCurrent->data)//插入 
		{
			newNode->next = pCurrent->next;
			pCurrent->next = newNode;
		}
		else
		{
			pCurrent = pCurrent->next; 
		}
	}
}

 
 1523: 链表插入(线性表)
时间限制:1s 内存限制:128MB
    
题目描述
(线性表)已知一单链表,从第二个结点至表尾递增有序,
(设a1<x<an)如下图(“第二个结点至表尾”指a1..an )。
试编写程序,将第一个结点删除并插入表中适当位置,使整个链表递增有序。
输入格式
输入长度n:7

输入数据:4 1 2 3 6 8 9

输出格式
1 2 3 4 6 8 9

样例输入
5
11 7 8 9 10
样例输出
7 8 9 10 11 
 */ 

 

 

这篇关于链表插入(线性表)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!