问答题 给定程序中已建立一个带有头结点的单向链表, 链表中的各结点按结点数据域中的数据递增有序链 接。函数fun的功能是:把形参x的值放入一个新结 点并插入到链表中,插入后各结点数据域的值仍保持 递增有序。 请在程序的下划线处填入正确的内容并把下划 线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; void fun(SLIST *h,int x) {SLIST *p,*q,*s; s=(SLIST *)malloc(sizeof(SLIST)); /******** **found* *********/ s->data=【1】; q=h; p=h->next; while(p!=NULL && x>p->data){ /**********found**********/ q=【2】; p=p->next; } s->next=p; /**********found**********/ q->next=【3】; } SLIST *creatlist(int *a) {SLIST *h,*p,*q; int i; h=p=(SLIST*)malloc(sizeof(SLIST)); for(i=0; idata=a[i];p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) {SLIST *p; p=h->next; if(p==NULL) printf("/nThe list is NULL!/n"); else { printf("/nHead"); do { printf("->%d",p->data); p=p->next;} while(p!=NULL); printf("->End/n"); } } main () {SLIST *head; int x; int a [N]= {11,12,15,18,19,22,25,29}; head=creatlist(a) ; printf("/nThe list before inserting: /n"); outlist(head); printf("/nEnter a number : "); scanf("%d",&x); fun(head,x); printf ("/nThe list after inserting: /n"); outlist(head); }
【正确答案】正确答案:(1)x (2)p (3)s
【答案解析】解析:第一空:“s=(SLIST*)malloc(sizeof(SLIST));”显然s是一个新结点,第一空处是给新结点的数据域赋值x,因此,第一空处应该是“s->data=x;”。 第二空:循环“while(p!=NULL&&x>p->data)”是用来寻找插入位置,当链表没有结束且x仍然大于p所指向的结点的数据时,就不断的向链表后面搜索。在循环体内,语句“p=p->next;”是找到下一个结点的地址,变量q用来保存当前结点的地址,因此,第二空处应该是“q=p;”。 第三空:“s->next=p;”将s插入链表当中,s指向p,此时s结点已经指向需要插入位置的下一个节点,因此,在需要插入s结点的位置的上一个结点需要指向s结点,故第三处应该为“q->next=s;”。