回 帖 发 新 帖 刷新版面

主题:这算法的功能是什么?

已知线性表链式存储结点类型LINKLIST定义为
typedef struot snode
  { int data;
    struct snode*next;
}LINKSTACK
下面函数的参数TOP为栈顶指针
LINKSTACK *pushstack(LINKSTACK*top,int x)
{
LINKLIST*t;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=x;
t->next=top;
top=t;
return p;
}

请问大家此算法的功能是__________________

回复列表 (共11个回复)

沙发

好像是链式栈!但为什么函数返回一个未定义的变量?p是否为全局变量,是的话这个函数干嘛要返回一个在本函数内未使用过的变量?

板凳

题目就是这样出的```还有一题和这题差不多!


已知线性表链式存储结点类型LINKLIST定义为
typedef struot node
  { int data;
    struct node*next;
}LINKLIST
下面函数参数中P为单链表中指向某一结点的指针.
void insertafter(int x,LINKLIST*p)
LINKLIST*t;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=x;
t->next=p->next;
p->next=t;
这算法又是什么功能?

3 楼

你实在看不出的话~应该在纸上画一下``不难看出!是个循环链表

4 楼

不知道是什么功能嘛!

5 楼

关于lz的第一个问题,我同意二楼的看法。lz列举的方法是关于单向链栈的入栈函数。
它 一个指向栈顶的指针 和 要入栈的数值。然后,在内存里分配一个大小为 一个链 的空间。之后,将被传递的数值 赋值给 链的数据项,链的next指针等于原来的栈顶地址。然后,把top(指示栈顶位置)指向 新分配的链。这里有一个问题,就是:函数传参的时候,LINKSTACK* top,函数只是在自己的区域内,创建了一个叫top的栈指针,然后把calling函数传给它的栈顶指针里的值复制到自己区域的top里的。所以,这是指针的传值。这样说的话,top只是calling函数栈顶指针的复制品而已,对top进行操作根本对calling函数栈顶指针没有影响。所以,这对lz代码来说,实在是一种缺憾。以下是修改过的C++函数

//定义关于链或栈的数据结构
typedef struct snode    
  { int data;
    struct snode*next;
}LINKSTACK
下面函数的参数TOP为栈顶指针
//这里用了引用符号(&),于是可以理解为 top是caller栈顶指针的引用。之后对top进行数据操作,就等同于对caller栈顶指针进行操作了。
LINKSTACK *pushstack(LINKSTACK* &top,int x) {
LINKLIST*t;
t=(LINKLIST*)malloc(sizeof(LINKLIST));
t->data=x;
t->next=top;
top=t;
//我不知道为什么要放一个未定义的p这里。建议去掉。
//return p; 
//改为 return top 这样或许有点用了。
return top; 
}

6 楼

关于楼主的第二个问题,我觉得这依然是单向链表。以下旁边是注释。
//Define a struct of LINKLIST.
typedef struot node
  { int data;
    struct node*next;
}LINKLIST;
下面函数参数中P为单链表中指向某一结点的指针.
void insertafter(int x,LINKLIST*p); //The function name suggest that it insert int x after the the linklist pointed to by p;
{
//declare a LINKLIST pointer 
LINKLIST*t;

// Allocate memory space for that pointer   
t=(LINKLIST*)malloc(sizeof(LINKLIST)); 

//now fill the member data with x we got from the caller function
t->data=x;    

//Here is somewhere you should be careful.Remember that p is pointing to the LINKLIST after which we gonna to create a new one.OK, well,let's say right now we have succeeded in creating our own.so we should set the next pointer with the address of the next struct,which can be luckily found in the p->next.Why? Remember p previously has done quite a good job as keeping tracking the starting address of LINKLIST that follows him by p->next pointer.But you just insert after him.Therefore you take the responsibility to take the address gracefully by assign pMe->next=p->next.Simple?
t->next=p->next;
//Here assign p->next to pMe.Why? Because you are just after him.
p->next=t;
}
Here is the diagram :
before |p        next|----------------------------->|??     next|
after  |p        next|---->|Me     next|----------->|??     next|

See the pattern. Have a good day. _(@_@)_

7 楼


可能是压入堆栈
但是你的返回值不对

8 楼

第一题功能是 插入新节点并做为头节点
第二题功能是 在单链表中插入新结点
 大家说这对吗?

9 楼

对,pushstack 英语里就是 压入栈 的意思。
而,insertafter 就是 在某某个栈后插入的意思。

10 楼


第一题应把“return p ;" 改为"return top;" 是一个链式存储的栈,实质是“插入新节点并做为头节点”
第二题功能是 在单链表中插入新结点,在p所指接点之后插入新接点:

   t->next=p->next;/*把p原来的后继结点做新结点t的后继结点(t的next 中记下p原来的后继结点的地址(在p->next中存着))*/
    p->next=t; /*t所指结点做p的后继结点,p的next 中记下t,即新结点的地址
这样,实现了新结点t在p后的插入。

我来回复

您尚未登录,请登录后再回复。点此登录或注册