主题:表头插入一个元素的算法 出问题了
//单链表操作
#include<stdio.h>
#include<stdlib.h>
#define NN 12
#define MM 20
typedef int ElemType;
struct sNode
{
ElemType data;
struct sNode* next;
};
void InitList(struct sNode** HL); //初始化线形表
void InsertFirstList(struct sNode** HL,ElemType x); //向线形表的表头插入一个元素
void TraverseList(struct sNode* HL); //遍历线形表
int SizeList(struct sNode* HL); //返回线形表的长度
int DeleteValueList(struct sNode** HL,ElemType x); //删除表中值为x的第一个结点,成功返回1,否则返回0
void InsertOrderList(struct sNode** HL,ElemType x); //向线形表中插入元素x结点,使插入后依然有序
void clearList(struct sNode**HL); //清除线形表的所有元素,使之成为空表
void InsertLastList(struct sNode** HL,ElemType x); //向线形表的表尾插入一个元素
int main()
{
int a[NN];
int i,m;
struct sNode *p,*h,*s;
InitList(&p); //初始化线形表
for(i=0;i<NN;i++) a[i]=rand()%MM; //随机取值
printf("随机数序列:");
for(i=0;i<NN;i++) printf("%5d",a[i]);
printf("\n");
m=rand(); //随机取值
for(i=0;i<NN;i++) InsertFirstList(&p,m); //向线形表的表头插入一个元素
TraverseList(p); //遍历线形表
printf("单链表长度:%d\n",SizeList(p)); //返回线形表的长度
m=rand();
for(i=0;i<NN;i++)InsertLastList(&p,m); //向线形表的表尾插入一个元素
TraverseList(p);
printf("单链表长度:%d\n",SizeList(p));
for(h=p;h!=NULL;h=h->next)
while(DeleteValueList(&(h->next),h->data));//删除表中值为x的第一个结点
printf("去除重复数:");
TraverseList(p);
printf("单链表长度:%d\n",SizeList(p));
h=NULL;
for(s=p;s!=NULL;s=s->next)
InsertOrderList(&h,s->data); //向线形表中插入元素x结点,使插入后依然有序
printf("有序表序列:");
TraverseList(h);
clearList(&p); //清除线形表的所有元素,使之成为空表
getchar();
getchar();
return 0;
}
void InitList(struct sNode** HL)
{
*HL=NULL;
}
void clearList(struct sNode**HL)
{
struct sNode *cp,*np;
cp=*HL;
while(cp!=NULL)
{
np=cp->next;
free(cp);
cp=np;
}
*HL=NULL;
}
int SizeList(struct sNode* HL)
{
int i=0;
while(HL!=NULL)
{
i++;
HL=HL->next;
}
return i;
}
void TraverseList(struct sNode* HL)
{
while(HL!=NULL)
{
printf("%5d",HL->data);
HL=HL->next;
}
printf("\n");
}
[color=FF0000][u][i][b][b]void InsertFirstList(struct sNode** HL,ElemType x)
{
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
newp->next=*HL;
*HL=newp;
}[/b][/b][/i][/u][/color]void InsertOrderList(struct sNode** HL,ElemType x)
{
struct sNode* cp=*HL,*ap=NULL;
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
if(cp==NULL||x<cp->data)
{
newp->next=cp;
*HL=newp;
return;
}
while(cp!=NULL)
{
if(x<cp->data) break;
else {ap=cp; cp=cp->next;}
}
newp->next=cp;
ap->next=newp;
}
int DeleteValueList(struct sNode** HL,ElemType x)
{
struct sNode *cp=*HL;
struct sNode *ap=NULL;
while(cp!=NULL)
{
if(cp->data==x) break;
ap=cp;
cp=cp->next;
}
if(cp==NULL) *HL=(*HL)->next;
else ap->next=cp->next;
free(cp);
return 1;
}
void InsertLastList(struct sNode** HL,ElemType x)
{
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
newp->next=NULL;
if(*HL==NULL) *HL=newp;
else {
struct sNode*p=*HL;
while(p->next!=NULL) p=p->next;
p->next=newp;
}
}
红色部分是在练表头插入一个元素的算法.但是运行之后发现插完后P只有第一个结点了.后面的不见了.怎么回事呢?
#include<stdio.h>
#include<stdlib.h>
#define NN 12
#define MM 20
typedef int ElemType;
struct sNode
{
ElemType data;
struct sNode* next;
};
void InitList(struct sNode** HL); //初始化线形表
void InsertFirstList(struct sNode** HL,ElemType x); //向线形表的表头插入一个元素
void TraverseList(struct sNode* HL); //遍历线形表
int SizeList(struct sNode* HL); //返回线形表的长度
int DeleteValueList(struct sNode** HL,ElemType x); //删除表中值为x的第一个结点,成功返回1,否则返回0
void InsertOrderList(struct sNode** HL,ElemType x); //向线形表中插入元素x结点,使插入后依然有序
void clearList(struct sNode**HL); //清除线形表的所有元素,使之成为空表
void InsertLastList(struct sNode** HL,ElemType x); //向线形表的表尾插入一个元素
int main()
{
int a[NN];
int i,m;
struct sNode *p,*h,*s;
InitList(&p); //初始化线形表
for(i=0;i<NN;i++) a[i]=rand()%MM; //随机取值
printf("随机数序列:");
for(i=0;i<NN;i++) printf("%5d",a[i]);
printf("\n");
m=rand(); //随机取值
for(i=0;i<NN;i++) InsertFirstList(&p,m); //向线形表的表头插入一个元素
TraverseList(p); //遍历线形表
printf("单链表长度:%d\n",SizeList(p)); //返回线形表的长度
m=rand();
for(i=0;i<NN;i++)InsertLastList(&p,m); //向线形表的表尾插入一个元素
TraverseList(p);
printf("单链表长度:%d\n",SizeList(p));
for(h=p;h!=NULL;h=h->next)
while(DeleteValueList(&(h->next),h->data));//删除表中值为x的第一个结点
printf("去除重复数:");
TraverseList(p);
printf("单链表长度:%d\n",SizeList(p));
h=NULL;
for(s=p;s!=NULL;s=s->next)
InsertOrderList(&h,s->data); //向线形表中插入元素x结点,使插入后依然有序
printf("有序表序列:");
TraverseList(h);
clearList(&p); //清除线形表的所有元素,使之成为空表
getchar();
getchar();
return 0;
}
void InitList(struct sNode** HL)
{
*HL=NULL;
}
void clearList(struct sNode**HL)
{
struct sNode *cp,*np;
cp=*HL;
while(cp!=NULL)
{
np=cp->next;
free(cp);
cp=np;
}
*HL=NULL;
}
int SizeList(struct sNode* HL)
{
int i=0;
while(HL!=NULL)
{
i++;
HL=HL->next;
}
return i;
}
void TraverseList(struct sNode* HL)
{
while(HL!=NULL)
{
printf("%5d",HL->data);
HL=HL->next;
}
printf("\n");
}
[color=FF0000][u][i][b][b]void InsertFirstList(struct sNode** HL,ElemType x)
{
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
newp->next=*HL;
*HL=newp;
}[/b][/b][/i][/u][/color]void InsertOrderList(struct sNode** HL,ElemType x)
{
struct sNode* cp=*HL,*ap=NULL;
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
if(cp==NULL||x<cp->data)
{
newp->next=cp;
*HL=newp;
return;
}
while(cp!=NULL)
{
if(x<cp->data) break;
else {ap=cp; cp=cp->next;}
}
newp->next=cp;
ap->next=newp;
}
int DeleteValueList(struct sNode** HL,ElemType x)
{
struct sNode *cp=*HL;
struct sNode *ap=NULL;
while(cp!=NULL)
{
if(cp->data==x) break;
ap=cp;
cp=cp->next;
}
if(cp==NULL) *HL=(*HL)->next;
else ap->next=cp->next;
free(cp);
return 1;
}
void InsertLastList(struct sNode** HL,ElemType x)
{
struct sNode *newp;
newp=(sNode*)malloc(sizeof(struct sNode));
if(newp==NULL)
{
printf("内存动态空间用完,退出运行!\n");
exit(1);
}
newp->data=x;
newp->next=NULL;
if(*HL==NULL) *HL=newp;
else {
struct sNode*p=*HL;
while(p->next!=NULL) p=p->next;
p->next=newp;
}
}
红色部分是在练表头插入一个元素的算法.但是运行之后发现插完后P只有第一个结点了.后面的不见了.怎么回事呢?