早教吧作业答案频道 -->其他-->
设L为单链表(带头结点),其中每个结点由一个整数域data和指针域next组成,……设L为单链表(带头结点),其中每个结点由一个整数域data和指针域next组成,整数域data中的数据都是正整
题目详情
设L为单链表(带头结点),其中每个结点由一个整数域 data和指针域next组成,……
设L为单链表(带头结点),其中每个结点由一个整数域 data和指针域next组成,整数域 data中的数据都是正整数且无相同的,试设计原地将该链表整理成数据递增的有序单链表的算法。
设L为单链表(带头结点),其中每个结点由一个整数域 data和指针域next组成,整数域 data中的数据都是正整数且无相同的,试设计原地将该链表整理成数据递增的有序单链表的算法。
▼优质解答
答案和解析
呵呵,刚做完一个差不多的程序,分享下。
#include
#include
#include
typedef struct node
{
int data;
struct node *next;
}Node;
void InitList(Node **head);
void CreateList(Node **head);
void InsertList(Node **head, int key);
void DeleteList(Node **head, int key);
void PrintList(Node **head);
void paixu(Node **head);
//初始化链表
void InitList(Node **head)
{
(*head) = (Node *)malloc(sizeof(Node));
(*head)->next = NULL;
}
//创建链表
void CreateList(Node **head)
{
int i;
printf("请输入要插入的数据(以0结束):\n");
scanf("%d", &i);
while(i != 0)
{
InsertList(head, i);
scanf("%d", &i);
}
}
//插入链表
void InsertList(Node **head, int key)
{
Node *p, *q, *s;
q = (*head);
p = (*head)->next;
while(p)
{
q = p;
p = p->next;
}
s = (Node *)malloc(sizeof(Node));
s->data = key;
s->next = NULL;
q->next = s;
}
//删除链表
void DeleteList(Node **head, int key)
{
Node *p, *q;
q = (*head);
p = (*head)->next;
while(p && p->data != key)
{
q = p;
p = p->next;
}
if(p)
{
q->next = p->next;
free(p);
p = NULL;
}
}
//输出链表
void PrintList(Node **head)
{
Node *p;
p = (*head)->next;
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
}
//排序链表
void paixu(Node **head)
{
Node *p,*q,*t,*s;
p=(*head)->next;
if(p==NULL) return;//没有节点
s=p->next;
if(s==NULL) return;//只有一个节点
p->next=NULL;//把链表截断成只有1个节点
while(s!=NULL)
{
t=s->next;//先记住下一个要处理的节点
s->next=NULL;//把当前节点独立出来
//从当前有序链表中查找插入点
q=(*head);
p=(*head)->next;
while(p!=NULL&&p->datadata)
{
q=p;
p=p->next;
}
//循环出来后,q是新插入节点的前驱,p是后继
q->next=s;
s->next=p;
//把之前记录的待处理节点传给s,以便循环继续处理未处理的节点
s=t;
}
}
int main(void)
{
Node *head;
int i;
InitList(&head);
CreateList(&head);
printf("删除前的数据:\n");
PrintList(&head);
printf("请输入要删除的数据:\n");
fflush(stdin);
scanf("%d", &i);
DeleteList(&head, i);
printf("删除后的数据:\n");
PrintList(&head);
paixu(&head);
printf("排序后的数据:\n");
PrintList(&head);
return 0;
}
#include
#include
#include
typedef struct node
{
int data;
struct node *next;
}Node;
void InitList(Node **head);
void CreateList(Node **head);
void InsertList(Node **head, int key);
void DeleteList(Node **head, int key);
void PrintList(Node **head);
void paixu(Node **head);
//初始化链表
void InitList(Node **head)
{
(*head) = (Node *)malloc(sizeof(Node));
(*head)->next = NULL;
}
//创建链表
void CreateList(Node **head)
{
int i;
printf("请输入要插入的数据(以0结束):\n");
scanf("%d", &i);
while(i != 0)
{
InsertList(head, i);
scanf("%d", &i);
}
}
//插入链表
void InsertList(Node **head, int key)
{
Node *p, *q, *s;
q = (*head);
p = (*head)->next;
while(p)
{
q = p;
p = p->next;
}
s = (Node *)malloc(sizeof(Node));
s->data = key;
s->next = NULL;
q->next = s;
}
//删除链表
void DeleteList(Node **head, int key)
{
Node *p, *q;
q = (*head);
p = (*head)->next;
while(p && p->data != key)
{
q = p;
p = p->next;
}
if(p)
{
q->next = p->next;
free(p);
p = NULL;
}
}
//输出链表
void PrintList(Node **head)
{
Node *p;
p = (*head)->next;
while(p)
{
printf("%d\n", p->data);
p = p->next;
}
}
//排序链表
void paixu(Node **head)
{
Node *p,*q,*t,*s;
p=(*head)->next;
if(p==NULL) return;//没有节点
s=p->next;
if(s==NULL) return;//只有一个节点
p->next=NULL;//把链表截断成只有1个节点
while(s!=NULL)
{
t=s->next;//先记住下一个要处理的节点
s->next=NULL;//把当前节点独立出来
//从当前有序链表中查找插入点
q=(*head);
p=(*head)->next;
while(p!=NULL&&p->data
{
q=p;
p=p->next;
}
//循环出来后,q是新插入节点的前驱,p是后继
q->next=s;
s->next=p;
//把之前记录的待处理节点传给s,以便循环继续处理未处理的节点
s=t;
}
}
int main(void)
{
Node *head;
int i;
InitList(&head);
CreateList(&head);
printf("删除前的数据:\n");
PrintList(&head);
printf("请输入要删除的数据:\n");
fflush(stdin);
scanf("%d", &i);
DeleteList(&head, i);
printf("删除后的数据:\n");
PrintList(&head);
paixu(&head);
printf("排序后的数据:\n");
PrintList(&head);
return 0;
}
看了 设L为单链表(带头结点),其...的网友还看了以下:
一个初中四点共圆的几何体,有能力的人来帮忙下如图,M、N、O、L四点共圆,L、O、T、Q也四点共圆 2020-05-13 …
(2013•大兴区二模)在三角形纸片ABC中,已知∠ABC=90°,AB=6,BC=8.过点A作直 2020-06-12 …
如图,正方形ABCD的顶点A(0,2√2),B(2√2,0),顶点C、D位于第一象限,直线l:x= 2020-06-13 …
已知椭圆C的离心率为根号3除以2在x轴上顶点为a1(-2,0),a2(2,0)1求椭圆的方程2.求 2020-06-21 …
直线l过点P(-4,0),它的参数方程为x=-4+√3t/2,y=t/2(t为参数),直线l与圆x 2020-07-22 …
已知A,B分别为曲线C:(y≥0,a>0)与x轴的左、右两个交点,直线l过点B,且与x轴垂直,S为 2020-07-25 …
已知椭圆C:x2a2+y2b2=1(a>b>0)的离心率为32,且在x轴上的顶点分别为A1(-2, 2020-07-26 …
直线坐标系xoy中,以原点为极点,x轴的正半轴为极轴建立极坐标系,曲线C的极坐标方程为ρ=小cos 2020-08-02 …
已知椭圆的中心在原点,焦点在x轴上,左右焦点分别为f1,f2,|f1f2|=2,且椭圆的一个顶点与两 2020-10-30 …
已知点P(1,−32)在椭圆C:x2a2+y2b2=1(a>b>0)上,椭圆C的左焦点为(-1,0) 2020-11-27 …