设一个单链表是一个非递减有序表 试写一个算法将x插入其中 并保持有序性

设一个单链表是一个非递减有序表 试写一个算法将x插入其中 并保持有序性,第1张

我帮你看了一下,找出了你错误的地方。

以下是修改后的源代码,修改地方核樱都有注释(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账号。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12478002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存