以下是修改后的源代码,修改地方核樱都有注释(vc++ 6.0下编译通过):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char datatype
typedef struct node
{
datatype data
struct node *next
} linklist
linklist*createlist()
{
//int num
datatype num/* 类型要保持一致 */
linklist *head,*s,*r
head=(linklist*)malloc(sizeof(linklist))
r=head
printf("请输入非递减链表,以#结束\n")
fflush(stdin)//清空输入缓冲区,避免回车字符被接收
num=getchar()
while(num!='#')
{
s=(linklist*)malloc(sizeof(linklist)) //令s为申请的空间掘悉
s->data=num
r->next=s
r=s
fflush(stdin)//清空输入缓冲区,避免回车字符被接收
num=getchar()
}
r->next=NULL
return head
}
//在带头节点的单链表head中查找第i个节点,若找到,则返回该节点的存储位置;否则返回判氏乎NULL
void putout(linklist *head) //单链表的输出
{
linklist *p
p=head->next
if(p==NULL) printf("链表为空")
else
{
while (p!=NULL)
{
printf("%c",p->data)//先这样写,最后要修改输出之间的间距
p=p->next
}
}
}
//void insert(linklist*head,int num) //插入函数,x为要插入的结点上的数据
void insert(linklist*head,datatype num/* 类型要保持一致 */) //插入函数,x为要插入的结点上的数据
{
linklist *s,*p,*q
s=(linklist*)malloc(sizeof(linklist)) //令s为申请的空间
s->data=num//s的数据是num
p=head->next
q=p->next //一开始p为第一个结点,q为第二个结点 (样本写反了还是?)
while(q!=NULL)
{
if(num<=q->data&&num>=p->data) //题设要求事先输入的是非递减,
{
p->next=s
s->next=q
break
} //找到并插入
else
{
p=q
q=q->next
} //没找到,继续往后移动
}
if(q == NULL)//没找到才执行这里, 不然p->data的值是上面while语句break出来后存的值,再进入这里执行就不对
{
//if(num>=q->data) //比最大的还大,则插入到最后面s->data能否换成num?
if(num>=p->data) //这里要写p->data,因为while语句找不到q已经指向NULL了
{
//q->next=s
p->next=s//这里要写p->data,因为while语句找不到q已经指向NULL了
s->next=NULL
}
if(num<=head->next->data)//比最小的还小,则插入到最前面
{
p=head->next //这一行没看懂有什么意义……待会儿去掉试试
head->next=s
s->next=p
}
}
}
void main()
{
linklist *head
//int num
datatype num/* 类型要保持一致 */
head=createlist()
putout(head)
printf("\n")
printf("请输入一个要插入的元素:")
//scanf("%d",&num)
fflush(stdin)//清空输入缓冲区,避免回车字符被接收
num=getchar()//类型要一致,继续字符形式输入
insert(head,num)//插入
putout(head)//输出
printf("\n")//换行,输出好看一点
}
另外你说打印为啥要%c,因为链表的生成是以字符输入,你%d的话打印的结果是字符的ascii码值。
希望对你有帮助。
#include<stdio.h>#include<string.h>
#include<malloc.h>
typedef struct LNode
{ int data
struct LNode *next
}LNode,*LinkList
void Creatlist(LinkList *L)
{ LinkList p,q
int num
*L=(LinkList)malloc(sizeof(LNode))
q=*L
printf("输入若干整数,输入-1表示结束\n")
while(scanf("%d",&num),num!=-1)
{ p=(LinkList)malloc(sizeof(LNode))
p->data=num
q->next=p
q=q->next
}
p->世闹迅next=NULL
}
void PrintList(LinkList L)
{ LinkList p
p = L->next
while(p)
{ 搜此printf("%d ",p->data)
p=p->next
}
printf("\n")
}
void MergeList(LinkList la,LinkList lb,LinkList *lc)
{ LinkList pa,pb,pc
pa=la->next
pb=lb->next
*lc=pc=la
while(pa&&pb)
{ if(pa->data<=pb->data)
{ pc->next=pa
pc=pa
pa=pa->next
}
else
{pc->next=pb
pc=pb
pb=pb->next
}
}
pc->next=pa?pa:pb
free(lb)
}
int main(void)
{ LinkList LA,LB,LC
Creatlist(&LA)
printf("LA: ") PrintList(LA)
Creatlist(&LB)
printf("LB: ") PrintList(LB)
MergeList(LA,LB,&LC)
printf("LC: ") PrintList(LC)
return 0
}
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct LNode
{
int data
struct LNode *next
} LNode,*LinkList
void Creatlist(LinkList *L)
{
LinkList p,q
int num
*L=(LinkList)malloc(sizeof(LNode))
q=*L
printf("输入若干整数,输入-1表示结束\n")
while(scanf("%d",&num),num!=-1)
{
p=(LinkList)malloc(sizeof(LNode))
p->data=num
q->next=p
q=q->next
}
p->next=NULL
}
void PrintList(LinkList L)
{
LinkList p
p = L->next
while(p)
{
printf("%d ",p->data)
弯袜p=p->next
}
printf("\n")
}
void MergeList(LinkList la,LinkList lb,LinkList *lc)
{
LinkList pa,pb,pc,pt
pa=la->next
pb=lb->next
*lc=pc=la
pc->next=NULL
free(lb)
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pt=pa->next
pa->next=pc->next
pc->next=pa
pa=pt
}
else
{
pt=pb->next
pb->next=pc->next
pc->next=pb
pb=pt
}
}
if(!pa)pa=pb
while(pa)
{
pt=pa->next
pa->next=pc->next
pc->next=pa
pa=pt
}
}
int main(void)
{
LinkList LA,LB,LC
Creatlist(&LA)
printf("LA: ")
PrintList(LA)
Creatlist(&LB)
printf("LB: ")
PrintList(LB)
MergeList(LA,LB,&LC)
printf("LC: ")
PrintList(LC)
return 0
}
-----------线性表的单链表存储结构-------------typedef struct Node{
ElemType data
struct Node *next
} *LNode, *LinkList
//----------线性表的单链表基本 *** 作------------
LinkList InitList(void)//构造一个空的线性表
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 *** 作结果:销毁线性表L。
LinkList MakeEmpty(LinkList L)//初始条件:线性表L已存搜漏宴在。 *** 作结果:将线性表L重置为空表。
int IsEmpty(LinkList L)//初始条件:线性表L已存在。 *** 作结果:判断线性表是否为空表。
int ListLength(LinkList L)//初始条件:线性表L已存在。 *** 作结果:返回线性表L结点的个数。
LNode IsLast(LinkList L)//初始条件:线性表L已存在。 *** 作结果:返回线性表L的最后一个结点(尾结点)。
LNode NewLNode(ElemType X)//构造一个数据域为X的新结点
LNode FindPrefious(ElemType X, LinkList L)//初始条件:线性表L已存在。 *** 作结果:在线性表L中寻找值为X的结点,若找到则返回该结点的前驱,否则返回NULL。
void ListDelete(LNode Pre)//初始条件:线性表L中结点P已找到。 *** 作结果:删除该结点。
void ListInsert(LNode Pre, LNode S)//初始条件:线性表L中结点P已找到,新结点S已构造。 *** 作结果:在该结点之前插入新结点X。
----------线性表的单链表基本 *** 作的算法实现------------
//我给链表设置了一个头结点,虽然它的数据域毫无意义,但它作为一个指针却意义非凡!
//它的作用我们在下面的例程中可以领教
LinkList InitList(void) //构造一个空的线性表
{
LNode Head
Head = (LNode)malloc(sizeof(struct Node))//为链表的头结点分配空间
if(!Head)
{
printf("Out of space!")
return NULL
}
Head->next = NULL
return Head//返回头结点
}
void DestroyList(LinkList *L)//初始条件:线性表L已存在。 *** 作结果:销毁线性表L。
{
LNode Head, P
if(*L)//若线性表L已存在
{
Head = *L
P = Head->next
while(!P) //把链表中除头结点外的所有结点释放
{
free(Head)
Head = P
P = Head->next
}
free(Head)//释放头结点
}
}
LinkList MakeEmpty(LinkList L)//初始条件:线性表L已存在。 *** 作结果:将线性表L重置为空表。
{
LNode Head, P
Head = *L
P = Head->next
while(!P)//把链表中除头结点外的所有结世银点释放
{
free(Head)
Head = P
P = Head->next
}
return (Head)//返回头结点
}
int IsEmpty(LinkList L)//初始条件:线性表L已存在。 *** 作结果:判断线性表是否为空表。
{
return L->next == NULL
}
int ListLength(LinkList L)//初始条件:线性表L已存在。 *** 作结果:返回线性表L结点的个数。
{
LNode P = L->next
int num = 0
while(P) //累积线性表L结点的个数
{
num++
P = P->next
}
return num//返回线性表L结点的个数
}
//初始条件:线性搜帆表L已存在。 *** 作结果:返回线性表L的最后一个结点(尾结点)。
LNode IsLast(LinkList L)
{
LNode P = L->next
if(P)
{
while(P->next) //遍历线性表L
P = P->next
}
return P//返回线性表L的最后一个结点,若为空表则返回NULL
}
LNode NewLNode(ElemType X)//构造一个数据域为X的新结点
{
LNode S
S = (LNode)malloc(sizeof(struct Node))//为新结点分配空间
if(!S)
{
printf("Out of space!")
return NULL
}
S->data = X
S->next = NULL
return S//返回新结点
}
//线性表L已存在。 *** 作结果:在线性表L中寻找值为X的结点,若找到则返回该结点的前驱,否则返回NULL。
LNode FindPrefious(ElemType X, LinkList L)
{
LNode P = L
while(P->next &&P->next->data != X)//遍历链表寻找值为X的结点
P = P->next
if(!P->next) //如果找不到值为X的结点,返回NULL
return NULL
else //若找到则返回该结点的前驱P
return P
}
void ListDelete(LNode Pre)//初始条件:线性表L中结点P已找到。 *** 作结果:删除该结点。
{
LNode P = Pre->next
Pre->next = P->next
free(P)
}
//初始条件:线性表L中结点P已找到,新结点S已构造。。 *** 作结果:在该结点之前插入新结点X。
void ListInsert(LNode Pre, LNode S)
{
S->next = Pre->next
Pre->next = S
}
如果还没解决你的问题,可以加我百度HI账号。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)