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