问题:以单链表的首结点值x为基准将该单链表分割为两部分,使所有小于x的结点排在大于或等于x的结点之前。
我写了这段代码输入后没反应,求看看是怎么回事。其中首结点值L->data=3
#include
#include
typedef int ElemType;
typedef struct LNode
{
ElemType data;//数值域
struct LNode *next; //指向后继结点 //指针域
} LinkNode;
void CreateListR(LinkNode *&L,ElemType a[],int n);
void DispList(LinkNode *L);
void InitList(LinkNode *&L,LinkNode *&P,int n);
int main()
{
LinkNode*L;
LinkNode*P;
int i,j,n;
char s;
scanf("%d",&n);
int a[n];
for(i=0;i'\n';i++)//遇到回车结束循环
{
scanf("%d",&a[i]);
s=getchar();//获取回车键信息
}
CreateListR(L,a,n);
InitList(L,P,n);
DispList(L);
return 0;
}
void CreateListR(LinkNode *&L,ElemType a[],int n)
//尾插法建立单链表
{
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
L->data=3;
L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点(r代表L,保持L头结点指针不变,才能正常输出链表)
for (int i=0;i//创建新结点s
s->data=a[i];
r->next=s; //将结点s插入结点r之后 //r->next指向数值域 //以下两行为核心
r=s; //r=r->next,即让指针r向后移动
}
s->next=NULL; //终端结点next域置为NULL
}
void DispList(LinkNode *L)
{
LinkNode *p=L->next;
while (p!=NULL)
{ printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void InitList(LinkNode *&L,LinkNode *&P,int n)
{
int i,k=0;
P=(LinkNode *)malloc(sizeof(LinkNode)); //创建头结点
LinkNode *w;
LinkNode *r,*e,*a;
w=P;
r=L;
e=L;
for(i=0;iif(r->data>L->data)
{
w->next=a->next;
e->next=e->next->next;
a->next=e->next;
w=w->next;
k++;
}
}
for(i=0;ir=r->next;
w->next=NULL;
r->next=P->next;
}
for(i=0;i<k;i++)
r=r->next;
w->next=NULL;
r->next=P->next;
你这个循环只能管到下面第一行,后面2行在for循环外面呢
单链表的首结点,不是头结点,代码里是把x写在了头结点里了,void InitList(LinkNode *&L,LinkNode *&P,int n)函数写得也有问题,修改如下,供参考:
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;//数值域
struct LNode* next; //指向后继结点 //指针域
} LinkNode;
void CreateListR(LinkNode*& L, ElemType a[], int n);
void DispList(LinkNode* L);
void InitList(LinkNode*& L); //void InitList(LinkNode*& L, LinkNode*& P, int n); 修改
int main()
{
LinkNode* L;
LinkNode* P;
int i, j, n;
char s;
scanf("%d", &n);
int a[100]; // 修改
for (i = 0; i < n && s != '\n'; i++)//遇到回车结束循环
{
scanf("%d", &a[i]);
s = getchar();//获取回车键信息
}
CreateListR(L, a, i); //CreateListR(L, a, n); 修改
InitList(L); //InitList(L, P, n); 修改
DispList(L);
return 0;
}
void CreateListR(LinkNode*& L, ElemType a[], int n)
//尾插法建立单链表
{
LinkNode* s, * r;
L = (LinkNode*)malloc(sizeof(LinkNode));//创建头结点
L->data = 3; //这句多余
L->next = NULL;
r = L; //r始终指向终端结点,开始时指向头结点(r代表L,保持L头结点指针不变,才能正常输出链表)
for (int i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));//创建新结点s
s->data = a[i];
r->next = s;//将结点s插入结点r之后 //r->next指向数值域 //以下两行为核心
r = s; //r=r->next,即让指针r向后移动
}
s->next = NULL;//终端结点next域置为NULL
}
void DispList(LinkNode* L)
{
LinkNode* p = L->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void InitList(LinkNode*& L) //修改
{
ElemType x;
LinkNode* p = L->next, * t = NULL, * h = NULL, * s = NULL; //以下修改
L->next = NULL;
x = p->data; //取得首结点的值 x
while (p) {
t = p; //脱离取得链表的一个结点
p = p->next;
t->next = NULL;
if (!L->next) //以下,将脱离出的结点 t 按照要求重新链入链表 L
L->next = t;
else if (t->data > x)
{
h = L;
while (h->next) h = h->next;
h->next = t;
}
else {
h = L->next; s = L;
while (h && h->data < x) s = h, h = h->next;
if (s == L) {
t->next = L->next;
L->next = t;
}
else {
t->next = s->next;
s->next = t;
}
}
}
}
#if 0 //以下删除
int i, k = 0;
P = (LinkNode*)malloc(sizeof(LinkNode)); //创建头结点
LinkNode* w;
LinkNode* r, * e, * a;
w = P;
r = L;
e = L;
for (i = 0; i < n; i++)
{
r = L;
e = L;
a = L;
if (r->data > L->data)
{
w->next = a->next;
e->next = e->next->next;
a->next = e->next;
w = w->next;
k++;
}
}
for (i = 0; i < k; i++)
r = r->next;
w->next = NULL;
r->next = P->next;
#endif
运行结果如下图: