如图,主函数中调用其他函数之后,前面的操作都是正常的,但是,调用函数之后就没有输出了
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,*LinkList;
void InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreateFromHead(LinkList L)
{
Node *s,*r;
r=L;
ElemType c;
int flag=1;
printf("请输入表中元素(示例:1 2 3 4 $):");
while(flag){
c=getchar();
if(c!='$'){
if(c!=' '){
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
}
else {flag=0;
r->next=NULL;}
}
}
Node *Locate(LinkList L,ElemType key)
{
Node *p;
p=L->next;
while(p!=NULL)
if(p->data!=key)
p=p->next;
else break;
return p;
}
int ListLength(LinkList L)
{
Node *p;
p=p->next;
int j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
return j;
}
int InsList(LinkList L,int i,ElemType e)
{
Node *pre,*s;
int k;
if(i<=0) return ERROR;
pre=L;
k=0;
while(pre!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre=NULL)
{
printf("插入位置不合理!");
return ERROR;
}
s=(Node*)malloc(sizeof(Node));
s->data=e;s->next=pre->next;
pre->next=s;
return OK;
}
void DelList(LinkList L,int i,ElemType *e)
{
Node *pre,*r;
int k;
pre=L;
k=0;
while(pre->next!=NULL&&k<i-1)
{
pre=pre->next;
k=k+1;
}
if(pre->next=NULL)
{
printf("删除结点位置不合理!");
return ;
}
r=pre->next;
pre->next=r->next;
*e=r->data;
free(r);
return ;
}
LinkList MergeLinkList(LinkList LA,LinkList LB)
{
Node *pa,*pb,*r;
LinkList LC;
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;
r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{r->next=pa;r=pa;pa=pa->next;}
else
{r->next=pb;r=pb;pb=pb->next;}
}
if(pa) r->next=pa;
else r->next=pb;
free(LB);
return(LC);
}
void Output(LinkList L)
{
Node *p;
p=L->next;
if(p==NULL){
printf("链表为空");
return;
}
printf("单链表中的元素为:");
while(p!=NULL){
printf("%c ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList L1,L2,L3;
int opt,n,leng;
ElemType key;
Node *loca;
int k,a;
InitList(&L1);
CreateFromHead(L1);
Output(L1);
printf("************************************************\n");
printf("************************************************\n");
printf("** 菜单 **\n");
printf("************************************************\n");
printf("** 1.查找值为key的结点 **\n");
printf("** 2.求单链表长度 **\n");
printf("** 3.插入数据元素到单链表具体位置 **\n");
printf("** 4.删除单链表特定位置的元素 **\n");
printf("** 5.将两个单链表合并为一个递增有序的单链表 **\n");
printf("************************************************\n");
printf("************************************************\n");
printf("请输入你想要进行的操作序号:\n");
scanf("%d",&opt);
switch (opt)
{
case 1:{
printf("请输入你要查找的值key:\n");
scanf("%d",&key);
loca=Locate(L1,key);
printf("key的位置序号为:%d\n",loca->data);
break;
}
case 2:{
leng=ListLength(L1);
printf("该链表长度为:%d\n",leng);
break;
}
case 3:{
printf("请输入要插入的结点位置:\n");
scanf("%d",&k);
printf("请输入要插入的值:\n");
scanf("%d",&a);
InsList(L1,k,a);
printf("新列表为:");
Output(L1);
break;
}
case 4:{
ElemType *e;
printf("请输入要删除的结点位置:\n");
scanf("%d",&k);
DelList(L1,k,e);
printf("新列表为:\n");
Output(L1);
printf("被删除的元素为:%d\n",e);
break;
}
case 5:{
LinkList L1,L2,L3;
printf("请输入另一个想要合并的顺序表:");
CreateFromHead(L2);
Output(L2);
InitList(&L3);
L3=MergeLinkList(L1,L2);
printf("合并后的顺序表为:");
printf("新列表为:");
Output(L3);
break;
}
}
return 0;
}