线性表的链式表示:
typedef struct LNode {
ElemType data;
struct LNode *nxt;
}LNode,*LinkList;
创建链表:
void createList(LinkList &L,int n){
L = (LinkList)malloc(sizeof(LNode));
L->nxt = NULL;
for (int i = 0; i < n; i++){
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d",&p->data);
p->nxt = L->nxt;
L->nxt = p;
}
}
实际,我觉得这块不加&也行,只不过调用前需将所要创建的节点进行初始化。
我的理解,一般而言,加一个&,就相当于引用一般,这函数里改变后其他函数也会相应改变。
归并:
void mergeList(LinkList& La, LinkList& Lb, LinkList & Lc){
LinkList p = La->nxt;
LinkList q = Lb->nxt;
Lc = La;
LinkList m = Lc;
while (p&&q){
if (p->data<=q->data)
{
m->nxt = p;
m = p;
p = p->nxt;
}
else
{
m->nxt = q;
m = q;
q = q->nxt;
}
}
m->nxt = p ? p : q;
free(Lb);
}
这里面,在mergeList函数里参数里使用的是&La,&LB,则此函数中free(Lb),也相当于对所对应主函数里的参数进行释放空间了,然而,尝试了去掉其中的&即mergeList(La,Lb,&Lc),依然能对所对应主函数里的参数进行释放空间,这是怎么一回事???如果有大神无意看到了, 还望解答。
总程序:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {
ElemType data;
struct LNode *nxt;
}LNode,*LinkList;
void createList(LinkList &L,int n){
L = (LinkList)malloc(sizeof(LNode));
L->nxt = NULL;
for (int i = 0; i < n; i++){
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d",&p->data);
p->nxt = L->nxt;
L->nxt = p;
}
}
void mergeList(LinkList& La, LinkList& Lb, LinkList & Lc){
LinkList p = La->nxt;
LinkList q = Lb->nxt;
Lc = La;
LinkList m = Lc;
while (p&&q){
if (p->data<=q->data)
{
m->nxt = p;
m = p;
p = p->nxt;
}
else
{
m->nxt = q;
m = q;
q = q->nxt;
}
}
m->nxt = p ? p : q;
free(Lb);
}
int main(){
LinkList La,Lb;
createList(La, 4);
createList(Lb, 7);
LinkList Lc;
mergeList(La, Lb, Lc);
return 0;
}
其中,数据形成的节点是依次插入到表头的,故,输入应该为按非递增的顺序,或将创建链表的程序改为插入表尾的