单链表的插入操作procedure insert(L:linklist; I:integer; x:datatype);var p,q:pointer;

题目

单链表的插入操作

procedure insert(L:linklist; I:integer; x:datatype);

var p,q:pointer;


相似考题

1.论述题 3 :针对以下 C 语言程序,请按要求回答问题( 18 分)已知 link.c 源程序如下:/*link.c 程序对单向链表进行操作 , 首先建立一个单向链表 , 然后根据用户的选择可以对其进行插入节点 、删除节点和链表反转操作 */#include#includetypedef struct list_node *list_pointer; // 定义链表指针typedef struct list_node{ // 定义链表结构int data;list_pointer link;}list_node;// 用到的操作函数:list_pointer create(); // 建立一个单向链表void insert(list_pointer *p_ptr, list_pointer node); // 在 node 后加入一个新的节点void delete_node(list_pointer *p_ptr, list_pointer trail, list_pointer node);// 删除前一个节点是 trail 的当前节点 nodevoid print(list_pointer ptr); // 打印链表节点中的值list_pointer invert(list_pointer lead); // 反转链表int main(){list_pointer ptr=NULL;list_pointer node, trail;list_pointer *p = &ptr;int choose, location, i;printf("you should create a link first:\n");// 建立一个单向链表:ptr=create(); /* ptr 指向链表的第一个节点 */print(ptr);// 根据用户的不同选择进行相应的操作:printf("input number 0, you can quit the program\n");printf("input number 1, you can insert a new node to link\n");printf("input number 2, you can delete a node from the link\n");printf("input number 3, you can invert the link\n");printf("please input your choice\n");scanf("%d", &choose);while(choose!=0){switch(choose){case 1:printf("you will insert a node to the link\n");printf("please input the location of the node:\n");scanf("%d", &location);node = ptr;i = 1;while(i<location){node = node->link;i++;}insert(p, node); /* p 为指向 ptr 的指针 */print(ptr);break;case 2:printf("you will delete a node from the link\n");printf("please input the location of the node:\n");scanf("%d", &location);node = ptr;if(location ==1)trail = NULL;trail = ptr;i = 1;while(i<location){trail = trail->link;i++;}node = trail->link;delete_node(p, trail, node);print(ptr);break;case 3:printf("you will invert the link\n");ptr = invert(ptr);print(ptr);break;default:break;return -1;}printf("please input your choice\n");scanf("%d", &choose);}return 0;}// 根据用户的输入数值建立一个新的单向链表:list_pointer create(){int i, current, length;list_pointer p1, p2, head;printf("please input the node number of the link:\n");scanf("%d", &length);printf("the number of the link is : %d\n", length);printf("please input the data for the link node:\n");i =0;p1= p2= (list_pointer) malloc(sizeof(list_node));head = p1;for(i = 0; iscanf("%d", ¤ t);p1->data = current;p2->link = p1;p2 = p1;p1 = (list_pointer) malloc(sizeof(list_node));}p2->link = NULL;return head;}……( 1 )画出主函数 main 的控制流程图。( 10 分)( 2 ) 设计一组测试用例 , 尽量使 main 函数的语句覆盖率能达到 100% 。 如果认为该函数的语句覆盖率无法达到 100% ,需说明原因。( 8 分)

2.针对以下C语言程序,请按要求回答问题。已知link. c源程序如下:/*link. c程序对单向链表进行操作,首先建立一个单向链表,然后根据用户的选择可以对其进行插入结点、删除结点和链表反转操作*/include<stdio. h>include<stdlib. h>typedef struct list_node * list_pointer; //定义链表指针typedef struct list_node{ //定义链表结构int data;list_pointer link;}list_node;//用到的操作函数list_pointer create(); //建立一个单向链表void insert(list_pointer * p_ptr,list_pointer node); //在node后加入一个新的结点void delete_node(list_pointer * p_ptr,list_pointer trail,list_pointer node);//删除前一个结点是trail的当前结点nodevoid print(list_pointer * p_ptr); //打印链表结点中的值list_pointer invert(list_pointer lead); //反转链表int main(){list_pointer ptr=NULL;list_pointer node,trail;list_pointer * P=&ptr;int choose,location,i;printf("you should create a link first:\n");//建立一个单向链表prt=create(); //ptr指向链表的第一个结点print(ptr);//根据用户的不同选择进行相应的操作:printf("input number 0,you can quit the program\n");printf("input number 1,you can insert a new node to link\n"):printf("input number 2,you can delete a node from the link\n");printf("input number 3,you can invert the link\n"):printf("please input you choice\n");scanf("%d",&choose);while(choose!=0){switch(choose){case 1:i=1:while(i<location){node=node->link;i++:}insert(p,node); //p为指向ptr的指针print(ptr);break;case 2:printf("you will delete a node from the link\n");printf("please input the location of the node:\n");scanf("%d",&location):node=ptr;if(location==1)trail=NULL;trail=ptr;i=1:while(i<location){trail=trail->link:i++:}node=trail->link;delete_node(p,trail,node);print(ptr);break;case 3:printf("you will invert the link\n");ptr=invert(ptr);print(ptr);break;default;break;return -1;}printf("please input you choice\n");scanf("%d". &choose):}return 0;//根据用户的输入值建立一个新的单向链表:list_pointer create(){int i,current,length;list_pointer p1,p2,head;printf("please input the node number of the link:\n");scanf("%d". &length):printf("the number of the link is:%d",length);printf("please input the data for the link node:\n");i=0;p1=p2=(list_pointer)malloc(sizeof(list_node));head=p1;for(i=1;i<length;i++){scanf("%d",&current);p1->data=current;p2->link=p1;p2=p1;p1=(list_pointer)malloc(sizeof(list_node));}p2->link=NULL;return head;}画出主函数main的控制流程图。

参考答案和解析
正确答案:

 

begin
p:=loc(L,I);
new(q);
q^.data:=x;
q^.next:=p^.next;
p^.next:=q;
inc(L.len);
end;

更多“单链表的插入操作procedure insert(L:linklist; I:integer; x:datatype);var p,q:pointer;”相关问题
  • 第1题:

    B.插入排序:

    思路:当前a[1]..a[i-1]已排好序了,现要插入a[i]使a[1]..a[i]有序。

    procedure insert_sort;

    var i,j:integer;


    正确答案:

     

    begin
    for i:=2 to n do begin
    a[0]:=a[i];
    j:=i-1;
    while a[0]<a[j] do begin
    a[j+1]:=a[j];
    j:=j-1;
    end;
    a[j+1]:=a[0];
    end;
    end;{inset_sort}

  • 第2题:

    D. 冒泡排序

    procedure bubble_sort;

    var i,j,k:integer;


    正确答案:

     

    begin
    for i:=1 to n-1 do
    for j:=n downto i+1 do
    if a[j]<a[j-1] then swap( a[j],a[j-1]); {每次比较相邻元素的关系}
    end;

  • 第3题:

    F. 归并排序

    {a为序列表,tmp为辅助数组}

    procedure merge(var a:listtype; p,q,r:integer);

    {将已排序好的子序列a[p..q]与a[q+1..r]合并为有序的tmp[p..r]}

    var I,j,t:integer;

    tmp:listtype;


    正确答案:

     

    begin
    t:=p;i:=p;j:=q+1;{t为tmp指针,I,j分别为左右子序列的指针}
    while (t<=r) do begin
    if (i<=q){左序列有剩余} and ((j>r) or (a[i]<=a[j])) {满足取左边序列当前元素的要求}
    then begin
    tmp[t]:=a[i]; inc(i);
    end
    else begin
    tmp[t]:=a[j];inc(j);
    end;
    inc(t);
    end;
    for i:=p to r do a[i]:=tmp[i];
    end;{merge}

    procedure merge_sort(var a:listtype; p,r: integer); {合并排序a[p..r]}
    var q:integer;
    begin
    if p<>r then begin
    q:=(p+r-1) div 2;
    merge_sort (a,p,q);
    merge_sort (a,q+1,r);
    merge (a,p,q,r);
    end;
    end;
    {main}
    begin
    merge_sort(a,1,n);
    end.

  • 第4题:

    高精度减法

    procedure substract(a,b:hp;var c:hp);

    var i,len:integer;


    正确答案:

     

    begin
    fillchar(c,sizeof(c),0);
    if a[0]>b[0] then len:=a[0] else len:=b[0];
    for i:=1 to len do begin
    inc(c[i],a[i]-b[i]);
    if c[i]<0 then begin inc(c[i],10);dec(c[i+1]); end;
    while (len>1) and (c[len]=0) do dec(len);
    c[0]:=len;
    end;

  • 第5题:

    高精度乘以高精度

    procedure high_multiply(a,b:hp; var c:hp}

    var i,j,len:integer;


    正确答案:

     

    begin
    fillchar(c,sizeof(c),0);
    for i:=1 to a[0] do
    for j:=1 to b[0] do begin
    inc(c[i+j-1],a[i]*b[j]);
    inc(c[i+j],c[i+j-1] div 10);
    c[i+j-1]:=c[i+j-1] mod 10;
    end;
    len:=a[0]+b[0]+1;
    while (len>1) and (c[len]=0) do dec(len);
    c[0]:=len;
    end;

  • 第6题:

    已知前序中序求后序

    procedure Solve(pre,mid:string);

    var i:integer;


    正确答案:

     

    begin
    if (pre='''') or (mid='''') then exit;
    i:=pos(pre[1],mid);
    solve(copy(pre,2,i),copy(mid,1,i-1));
    solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i));
    post:=post+pre[1]; {加上根,递归结束后post即为后序遍历}
    end;

  • 第7题:

    单链表的删除操作

    procedure delete(L:linklist; I:integer);

    var p,q:pointer;


    正确答案:

     

    begin
    p:=loc(L,I-1);
    q:=p^.next;
    p^.next:=q^.next;
    dispose(q);
    dec(L.len);
    end;

  • 第8题:

    阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 函数 GetListElemPtr(LinkList L,int i)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。 函数DelListElem(LinkList L,int i,ElemType *e) 的功能是删除含头结点单链表的第 i个元素结点,若成功则返回 SUCCESS ,并由参数e 带回被删除元素的值,否则返回ERROR 。 例如,某含头结点单链表 L 如图 4-1 (a) 所示,删除第 3 个元素结点后的单链表如 图 4-1 (b) 所示。图4-1

    define SUCCESS 0 define ERROR -1 typedef int Status; typedef int ElemType; 链表的结点类型定义如下: typedef struct Node{ ElemType data; struct Node *next; }Node ,*LinkList; 【C 代码】 LinkList GetListElemPtr(LinkList L ,int i) { /* L是含头结点的单链表的头指针,在该单链表中查找第i个元素结点: 若找到,则返回该元素结点的指针,否则返回NULL */ LinkList p; int k; /*用于元素结点计数*/ if (i<1 ∣∣ !L ∣∣ !L->next) return NULL; k = 1; P = L->next; / *令p指向第1个元素所在结点*/ while (p && (1) ) { /*查找第i个元素所在结点*/ (2) ; ++k; } return p; } Status DelListElem(LinkList L ,int i ,ElemType *e) { /*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/ LinkList p,q; /*令p指向第i个元素的前驱结点*/ if (i==1) (3) ; else p = GetListElemPtr(L ,i-1); if (!p ∣∣ !p->next) return ERROR; /*不存在第i个元素*/ q = (4) ; /*令q指向待删除的结点*/ p->next = q->next; /*从链表中删除结点*/ (5) ; /*通过参数e带回被删除结点的数据*/ free(q); return SUCCESS; }


    正确答案:(1) k<i
    (2) p = p->next
    (3) p=L
    (4) p->next
    (5) *e = q->data

  • 第9题:

    设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为()。

    A.p->next=s;s->next=q;
    B.q->next=s;s->next=p;
    C.p->next=s->next;s->next=p;
    D.s->next=p->next;p->next=-s;

    答案:B
    解析:
    插入s结点,应使s的next指针指向p结点,使q结点的next指针指向s。

  • 第10题:

    函数GetElem实现返回单链表的第i个元素,请在空格处将算法补充完整。 int GetElem(LinkList L,int i,Elemtype *e){ LinkList p;int j;p=L->next;j=1; while(p&&ji) return ERROR;*e= (2) ;return OK;}


    正确答案:(1)p=p->next (2)p->data

  • 第11题:

    填空题
    函数实现单链表的删除算法,请在空格处将算法补充完整。int ListDelete(LinkList L,int i,ElemType *s){ LNode *p,*q; int j; p=L;j=0; while(( (1) )&&(jnext;j++; } if(p->next==NULL||j>i-1) return ERROR; q=p->next; (2) ; *s=q->data; free(q); return OK;}/*listDelete*/

    正确答案: (1)p->next!=NULL (2)p->next=q->next
    解析: 暂无解析

  • 第12题:

    填空题
    函数GetElem实现返回单链表的第i个元素,请在空格处将算法补充完整。 int GetElem(LinkList L,int i,Elemtype *e){ LinkList p;int j;p=L->next;j=1; while(p&&ji) return ERROR;*e= (2) ;return OK;}

    正确答案: (1)p=p->next (2)p->data
    解析: 暂无解析

  • 第13题:

    C.选择排序:

    procedure sort;

    var i,j,k:integer;


    正确答案:

     

    begin
    for i:=1 to n-1 do
    for j:=i+1 to n do
    if a[i]>a[j] then swap(a[i],a[j]);
    end;

  • 第14题:

    E.堆排序:

    procedure sift(i,m:integer);{调整以i为根的子树成为堆,m为结点总数}

    var k:integer;


    正确答案:

     

    begin
    a[0]:=a[i]; k:=2*i;{在完全二叉树中结点i的左孩子为2*i,右孩子为2*i+1}
    while k<=m do begin
    if (k<m) and (a[k]<a[k+1]) then inc(k);{找出a[k]与a[k+1]中较大值}
    if a[0]<a[k] then begin a[i]:=a[k];i:=k;k:=2*i; end
    else k:=m+1;
    end;
    a[i]:=a[0]; {将根放在合适的位置}
    end;

    procedure heapsort;
    var
    j:integer;
    begin
    for j:=n div 2 downto 1 do sift(j,n);
    for j:=n downto 2 do begin
    swap(a[1],a[j]);
    sift(1,j-1);
    end;
    end;

  • 第15题:

    高精度数的定义:

    type

    hp=array[1..maxlen] of integer;

    1.高精度加法

    procedure plus ( a,b:hp; var c:hp);

    var i,len:integer;


    正确答案:

     

    begin
    fillchar(c,sizeof(c),0);
    if a[0]>b[0] then len:=a[0] else len:=b[0];
    for i:=1 to len do begin
    inc(c[i],a[i]+b[i]);
    if c[i]>10 then begin dec(c[i],10); inc(c[i+1]); end; {进位}
    end;
    if c[len+1]>0 then inc(len);
    c[0]:=len;
    end;{plus}

  • 第16题:

    高精度乘以低精度

    procedure multiply(a:hp;b:longint;var c:hp);

    var i,len:integer;


    正确答案:

     

    begin
    fillchar(c,sizeof(c),0);
    len:=a[0];
    for i:=1 to len do begin
    inc(c[i],a[i]*b);
    inc(c[i+1],(a[i]*b) div 10);
    c[i]:=c[i] mod 10;
    end;
    inc(len);
    while (c[len]>=10) do begin {处理最高位的进位}
    c[len+1]:=c[len] div 10;
    c[len]:=c[len] mod 10;
    inc(len);
    end;
    while (len>1) and (c[len]=0) do dec(len); {若不需进位则调整len}
    c[0]:=len;
    end;{multiply}

  • 第17题:

    高精度除以低精度

    procedure devide(a:hp;b:longint; var c:hp; var d:longint);

    {c:=a div b; d:= a mod b}

    var i,len:integer;


    正确答案:

     

    begin
    fillchar(c,sizeof(c),0);
    len:=a[0]; d:=0;
    for i:=len downto 1 do begin
    d:=d*10+a[i];
    c[i]:=d div b;
    d:=d mod b;
    end;
    while (len>1) and (c[len]=0) then dec(len);
    c[0]:=len;
    end;

  • 第18题:

    链表的定位函数

    loc(I:integer):pointer; {寻找链表中的第I个结点的指针}

    procedure loc(L:linklist; I:integer):pointer;

    var p:pointer;

    j:integer;


    正确答案:

     

    begin
    p:=L.head; j:=0;
    if (I>=1) and (I<=L.len) then
    while j<I do begin p:=p^.next; inc(j); end;
    loc:=p;
    end;

  • 第19题:

    执行下列语句后指针及链表的示意图为(43)。

    L = (LinkList) malloc ( sizeof (LNode) );

    P = L;

    for(i =0;i <=3;i ++) {

    P→next = (LinkList) malloc (sizeof (LNode));

    P = P→next;

    P→data = i * i + 1;

    }

    A.

    B.

    C.

    D.


    正确答案:B
    解析:题中语句的作用是建一个带头结点的链表,链表中的各个元素为i*i+1(i=0,1,2,3),即1,2,5,10。

  • 第20题:

    阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
    [说明]
    函数GetListElemPtr(LinkList L,int i)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。
    函数DelListElem(LinkList L,int i,ElemType *e)的功能是删除含头结点单链表的第i个元素结点,若成功则返回SUCCESS,并由参数e带回被删除元素的值,否则返回ERROR。
    例如,某含头结点单链表L如下图(a)所示,删除第3个元素结点后的单链表如下图(b)所示。
    1.jpg

    #define SUCCESS 0 #define ERROR -1 typedef intStatus; typedef intElemType;

    链表的结点类型定义如下:

    typedef struct Node{ ElemType data; struct Node *next; }Node,*LinkList; [C代码] LinkListGetListElemPtr(LinkList L,int i) { /*L是含头结点的单链表的头指针,在该单链表中查找第i个元素结点; 若找到,则返回该元素结点的指针,否则返回NULL */ LinkList p; int k; /*用于元素结点计数*/ if(i<1 || !L || !L->next) return NULL; k=1; p=L->next; /*令p指向第1个元素所在结点*/ while(p &&______){ /*查找第i个元素所在结点*/ ______; ++k; } return p; } StatusDelListElem(LinkList L,int i,ElemType *e) { /*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/ LinkList p,q; /*令P指向第i个元素的前驱结点*/ if(i==1) ______; else p=GetListElemPtr(L,i-1); if(!P || !p->next) return ERROR; /*不存在第i个元素*/ q=______; /*令q指向待删除的结点*/ p->next=q->next; //从链表中删除结点*/ ______; /*通过参数e带回被删除结点的数据*/ free(q); return SUCCESS; }


    答案:
    解析:
    k<i
    p=p->next
    p=L
    p->next
    *e=q->data


    【解析】

    本题考查C语言的指针应用和运算逻辑。
    本问题的图和代码中的注释可提供完成操作的主要信息,在充分理解链表概念的基础上填充空缺的代码。
    函数GetListElemPtr(LinkList L,int i)的功能是在L为头指针的链表中查找第i个元素,若找到,则返回指向该结点的指针,否则返回空指针。描述查找过程的代码如下,其中k用于对元素结点进行计数。

    k=1; p=L->next; /*令p指向第1个元素所在结点*/

  • 第21题:

    函数实现单链表的插入算法,请在空格处将算法补充完整。int ListInsert(LinkList L,int i,ElemType e){ LNode *p,*s;int j; p=L;j=0; while((p!=NULL)&&(jnext;j++; } if(p==NULL||j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode)); s->data=e; (1) ; (2) ; return OK;}/*ListInsert*/


    正确答案:(1)s->next=p->next (2)p->next=s

  • 第22题:

    函数实现单链表的删除算法,请在空格处将算法补充完整。int ListDelete(LinkList L,int i,ElemType *s){ LNode *p,*q; int j; p=L;j=0; while(( (1) )&&(jnext;j++; } if(p->next==NULL||j>i-1) return ERROR; q=p->next; (2) ; *s=q->data; free(q); return OK;}/*listDelete*/


    正确答案:(1)p->next!=NULL (2)p->next=q->next

  • 第23题:

    填空题
    函数实现单链表的插入算法,请在空格处将算法补充完整。int ListInsert(LinkList L,int i,ElemType e){ LNode *p,*s;int j; p=L;j=0; while((p!=NULL)&&(jnext;j++; } if(p==NULL||j>i-1) return ERROR; s=(LNode *)malloc(sizeof(LNode)); s->data=e; (1) ; (2) ; return OK;}/*ListInsert*/

    正确答案: (1)s->next=p->next (2)p->next=s
    解析: 暂无解析