在输出完所有小于X的节点后会莫名其妙打印一个地址。
#include
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}LinkNode;
void InitList(LinkNode *&L)
{
L=(LinkNode *)malloc(sizeof(LinkNode));
if(L==NULL)
{
printf("内存分配失败!!\n");
exit(0);
}
L->next==NULL;
}
void creatList(LinkNode *&L,ElemType a,int n)//n为索要创建的元素个数, 尾插法
{
int i;
LinkNode *s,*r;
r=L;//r为尾指针
for(i=0;i<n;i++)
{
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a;
r->next=s;
r=s;
}
r->next=NULL;
}
void printlist(LinkNode &L)
{
struct Node pmove=L->next;
while(pmove)
{
printf("%d\t",pmove->data);
pmove=pmove->next;
}
printf("\n");
}
bool InsertNode(LinkNode *&L,ElemType i,ElemType a)//i为要插入的位置,a为要插入的元素
{
int j=0;
LinkNode *pmove=L;//遍历指针
LinkNode *newNode;
if(i<1)
{
return false;
}
while(j<i-1&&pmove!=NULL)
{
pmove=pmove->next;
j++;
}
if(pmove==NULL)
{
printf("无法插入,位置溢出\n");
}
newNode=(LinkNode *)malloc(sizeof(LinkNode));
newNode->data=a;
newNode->next=pmove->next;
pmove->next=newNode;
printf("插入成功\n");
return true;
}
bool ListDelete(LinkNode * &L,int i){
int j = 0;
LinkNode *p=L,*q;
if(i<1){
printf("i值错误\n");
return false;
}
while(j<i-1 && p!=NULL){
j++;
p=p->next;
}
if(p == NULL){ //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i-1个结点
printf("不存在这个结点\n");
return(false);
}
q=p->next; //q指向第i个结点
if(q == NULL){ //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i个结点
printf("不存在这个结点\n");
return(false);
}
p->next=q->next; //第i-1个结点p接到第i+1个结点
free(q);
printf("删除成功!!\n");
return(true);
}
//释放单链表
void DestoryList(LinkNode * &L){
LinkNode *p=L; //从头指针开始释放,p用来释放指针
LinkNode *s=p->next; //s用来保存下一个结点地址
while(s != NULL){
free(p);
p=s;
s=p->next;
}
free(p);
}
LinkNode partition(LinkNode &L, int x) {
LinkNode small = (LinkNode )malloc(sizeof( LinkNode));
LinkNode smallHead = small;
LinkNode large =(LinkNode ) malloc(sizeof( LinkNode));
LinkNode largeHead = large;
while (L != NULL) {
if (L->data < x) {
small->next = L;
small = small->next;
} else {
large->next = L;
large = large->next;
}
L = L->next;
}
large->next = NULL;
small->next = largeHead->next;
return smallHead;
}
int main()
{
LinkNode *L;
ElemType a,b,c;
InitList(L);
printf("请输入要插入的元素及个数:\n");
scanf("%d %d",&a,&b);
creatList(L,a,b);
InsertNode(L,2,3);
printlist(L);
printf("请输入你要删除的位置:\n");
scanf("%d",&c);
ListDelete(L,c);
printlist(L);
printf("交换后:\n");
LinkNode *p=partition(L,3);
printlist(p);
}
partition函数里,应该是从L->next开始,不是从L开始。
修改后运行结果:
代码修改如下:(主要是修改的partition函数,DestoryList函数也调整了一下,但是你代码中没调用,没什么影响)
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LinkNode;
void InitList(LinkNode*& L)
{
L = (LinkNode*)malloc(sizeof(LinkNode));
if (L == NULL)
{
printf("内存分配失败!!\n");
exit(0);
}
L->next == NULL;
}
void creatList(LinkNode*& L, ElemType a, int n)//n为索要创建的元素个数, 尾插法
{
int i;
LinkNode* s, * r;
r = L;//r为尾指针
for (i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a;
r->next = s;
r = s;
}
r->next = NULL;
}
void printlist(LinkNode* & L)
{
struct Node *pmove = L->next;
while (pmove)
{
printf("%d\t", pmove->data);
pmove = pmove->next;
}
printf("\n");
}
bool InsertNode(LinkNode*& L, ElemType i, ElemType a)//i为要插入的位置,a为要插入的元素
{
int j = 0;
LinkNode* pmove = L;//遍历指针
LinkNode* newNode;
if (i < 1)
{
return false;
}
while (j < i - 1 && pmove != NULL)
{
pmove = pmove->next;
j++;
}
if (pmove == NULL)
{
printf("无法插入,位置溢出\n");
}
newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = a;
newNode->next = pmove->next;
pmove->next = newNode;
printf("插入成功\n");
return true;
}
bool ListDelete(LinkNode*& L, int i) {
int j = 0;
LinkNode* p = L, * q;
if (i < 1) {
printf("i值错误\n");
return false;
}
while (j < i - 1 && p != NULL) {
j++;
p = p->next;
}
if (p == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i-1个结点
printf("不存在这个结点\n");
return(false);
}
q = p->next; //q指向第i个结点
if (q == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i个结点
printf("不存在这个结点\n");
return(false);
}
p->next = q->next; //第i-1个结点p接到第i+1个结点
free(q);
printf("删除成功!!\n");
return(true);
}
//释放单链表
void DestoryList(LinkNode*& L) {
LinkNode* p = L; //从头指针开始释放,p用来释放指针
LinkNode* s;// = p->next; //s用来保存下一个结点地址
while (p != NULL) {
s = p->next;
free(p);
p = s;
}
L = 0;
}
LinkNode* partition(LinkNode*& L, int x) {
LinkNode* small = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* smallHead = small;
LinkNode* large = (LinkNode*)malloc(sizeof(LinkNode));
LinkNode* largeHead = large;
LinkNode* pp = L->next;
while (pp != NULL) {
if (pp->data < x) {
small->next = pp;
small = small->next;
}
else {
large->next = pp;
large = large->next;
}
pp = pp->next;
}
large->next = NULL;
small->next = largeHead->next;
return smallHead;
}
int main()
{
LinkNode* L;
ElemType a, b, c;
InitList(L);
printf("请输入要插入的元素及个数:\n");
scanf("%d %d", &a, &b);
creatList(L, a, b);
InsertNode(L, 2, 3);
printlist(L);
printf("请输入你要删除的位置:\n");
scanf("%d", &c);
ListDelete(L, c);
printlist(L);
printf("交换后:\n");
LinkNode* p = partition(L, 3);
printlist(p);
}
添加//*******************************的地方是我改动的地方
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}LinkNode;
void InitList(LinkNode*& L)
{
L = (LinkNode*)malloc(sizeof(LinkNode));
if (L == NULL)
{
printf("内存分配失败!!\n");
exit(0);
}
L->next = NULL;//*******************************
}
void creatList(LinkNode*& L, ElemType a, int n)//n为索要创建的元素个数, 尾插法
{
int i;
LinkNode* s, * r;
r = L;//r为尾指针
for (i = 0; i < n; i++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = a;
r->next = s;
r = s;
}
r->next = NULL;
}
void printlist(LinkNode& L)
{
struct Node* pmove = L.next;//*******************************
while (pmove)
{
printf("%d\t", pmove->data);
pmove = pmove->next;
}
printf("\n");
}
bool InsertNode(LinkNode*& L, ElemType i, ElemType a)//i为要插入的位置,a为要插入的元素
{
int j = 0;
LinkNode* pmove = L;//遍历指针
LinkNode* newNode;
if (i < 1)
{
return false;
}
while (j < i - 1 && pmove != NULL)
{
pmove = pmove->next;
j++;
}
if (pmove == NULL)
{
printf("无法插入,位置溢出\n");
}
newNode = (LinkNode*)malloc(sizeof(LinkNode));
newNode->data = a;
newNode->next = pmove->next;
pmove->next = newNode;
printf("插入成功\n");
return true;
}
bool ListDelete(LinkNode*& L, int i) {
int j = 0;
LinkNode* p = L, * q;
if (i < 1) {
printf("i值错误\n");
return false;
}
while (j < i - 1 && p != NULL) {
j++;
p = p->next;
}
if (p == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i-1个结点
printf("不存在这个结点\n");
return(false);
}
q = p->next; //q指向第i个结点
if (q == NULL) { //p=null只有两种情况,一种是L表为空,另一种是遍历完整个链表
//没发现第i个结点
printf("不存在这个结点\n");
return(false);
}
p->next = q->next; //第i-1个结点p接到第i+1个结点
free(q);
printf("删除成功!!\n");
return(true);
}
//释放单链表
void DestoryList(LinkNode*& L) {
LinkNode* p = L; //从头指针开始释放,p用来释放指针
LinkNode* s = p->next; //s用来保存下一个结点地址
while (s != NULL) {
free(p);
p = s;
s = p->next;
}
free(p);
}
LinkNode* partition(LinkNode& L, int x) {
LinkNode* small = (LinkNode*)malloc(sizeof(LinkNode));//*******************************
LinkNode* smallHead = small;;//*******************************
LinkNode* large = (LinkNode*)malloc(sizeof(LinkNode));;//*******************************
LinkNode* largeHead = large;;//*******************************
LinkNode* pNode = L.next;;//*******************************
while (pNode != NULL) {
if (pNode->data < x) {
small->next = pNode;
small = small->next;
}
else {
large->next = pNode;
large = large->next;
}
pNode = pNode->next;
}
large->next = NULL;
small->next = largeHead->next;
return smallHead;
}
int main()
{
LinkNode* L;
ElemType a, b, c;
InitList(L);
printf("请输入要插入的元素及个数:\n");
scanf("%d %d", &a, &b);
creatList(L, a, b);
InsertNode(L, 2, 3);
printlist(*L);
printf("请输入你要删除的位置:\n");
scanf("%d", &c);
ListDelete(L, c);
printlist(*L);
printf("交换后:\n");
LinkNode* p = partition(*L, 3);
printlist(*p);
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!