|
5鱼币
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
- List Merge( List L1, List L2 );
复制代码
其中List结构定义如下:
- typedef struct Node *PtrToNode;
- struct Node {
- ElementType Data; /* 存储结点数据 */
- PtrToNode Next; /* 指向下一个结点的指针 */
- };
- typedef PtrToNode List; /* 定义单链表类型 */
复制代码
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
- #include <stdio.h>
- #include <stdlib.h>
- typedef int ElementType;
- typedef struct Node *PtrToNode;
- struct Node {
- ElementType Data;
- PtrToNode Next;
- };
- typedef PtrToNode List;
- List Read(); /* 细节在此不表 */
- void Print( List L ); /* 细节在此不表;空链表将输出NULL */
- List Merge( List L1, List L2 );
- int main()
- {
- List L1, L2, L;
- L1 = Read();
- L2 = Read();
- L = Merge(L1, L2);
- Print(L);
- Print(L1);
- Print(L2);
- return 0;
- }
- /* 你的代码将被嵌在这里 */
复制代码
我的代码:
- List Merge( List L1, List L2 )
- {
- List head,temp;
- head = temp = (List)malloc(sizeof(struct Node));
-
- L1 = L1->Next;
- L2 = L2->Next;
- while(L1 && L2)
- {
- if(L1->Data <= L2->Data)
- {
- temp->Next = L1;
- L1 = L1->Next;
- }
- else
- {
- temp->Next = L2;
- L2 = L2->Next;
- }
- temp = temp->Next;
- }
-
- if(L1)
- {
- while(L1)
- {
- temp->Next = L1;
- L1 = L1->Next;
- temp = temp->Next;
- }
- temp->Next = NULL;
- }
-
- else if(L2)
- {
- while(L2)
- {
- temp->Next = L2;
- L2 = L2->Next;
- temp = temp->Next;
- }
- temp->Next = NULL;
- }
- else
- temp->Next = NULL;
- //到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
- return head;
- }
复制代码
实例测试:
结果图片:
我在函数里通过传进去结构体指针L1 L2修改L1 L2的节点位置 最后返回head 最后在main函数里打印出来的链表却是原始节点 按照正常情况下 在Merge函数里 L1 L2都为NULL。
函数是传值操作,但是传入的L1 L2是结构体指针 所以传入的L1 L2应该是地址吧?那为什么在Merge函数里做的修改都没有用 那如果需要修改 要怎样才行呢?
比如在main函数里 a = 4; int *p = a; 我把p传进一个函数里做修改,最后回到main函数里打印a的值 能够做修改 这里传递指针p和结构体指针有什么区别呢? 为什么结构体指针传进去不能做修改呢? 求解答 十分感谢!
我确实没认真看题,^_^
我是先直接看的代码
- #include <stdio.h>
- #include <stdlib.h>
- typedef int ElementType;
- typedef struct Node *PtrToNode;
- struct Node {
- ElementType Data;
- PtrToNode Next;
- };
- typedef PtrToNode List;
- List Read(); /* 细节在此不表 (也就是说提交的时候可以不考虑,不过还是要写的!) */
- void Print(List L); /* 细节在此不表;空链表将输出NULL (同上)*/
- List Merge(List L1, List L2);
- // 你是不是忘了写这个函数了?
- void list_free(List L) {
- if(L) list_free(L->Next);
- free(L);
- }
- int main(void) {
- List L1, L2, L;
- L1 = Read();
- L2 = Read();
- L = Merge(L1, L2);
- Print(L);
- Print(L1);
- Print(L2);
- list_free(L);
- // 现在就可以free了
- list_free(L1);
- list_free(L2);
- // 要共用节点的话,这两个就只能单独释放了
- //free(L1);
- //free(L2);
- return 0;
- }
- /* 你的代码将被嵌在这里 */
- List Read() {
- int n, i;
- scanf("%d", &n);
- //List L = (List)malloc(sizeof(PtrToNode)); /// 申请一个头结点
- //List L = malloc(sizeof(PtrToNode)); // 这是C语言,没必要强制转换
- //List L = malloc(sizeof(struct Node)); // 是PtrToNode还是struct Node?
- List L = malloc(sizeof(*L)); // 对吧?管他什么类型了
- L->Next = NULL; // 头指针为空
- if(n) // 当n不是0时
- {
- List r = L; /// r是一个中间变量的节点
- for(i = 0; i < n; i++) {
- //List p = (List)malloc(sizeof(struct Node));
- List p = malloc(sizeof(*p));
- //scanf("%d", &(p->Data)); // 尾插法
- scanf("%d", &p->Data); // 尾插法
- r->Next = p;
- r = p;
- }
- r->Next = NULL;
- }
- return L;
- }
- void Print(List L) {
- List p = L->Next;
- if(p) {
- List r;
- r = L;
- while(r->Next) {
- r = r->Next;
- printf("%d ", r->Data);
- }
- } else {
- printf("NULL");
- }
- printf("\n");
- }
- #if 0
- // 好了,知道定义了
- List Merge(List L1, List L2) {
- List L = malloc(sizeof(*L));
- L->Next = NULL;
- List *px = &L->Next;
- List p1 = L1->Next;
- List p2 = L2->Next;
- while(p1 && p2) {
- ElementType v;
- ElementType a = p1->Data;
- ElementType b = p2->Data;
- if(a < b) {
- v = a; p1 = p1->Next;
- } else {
- v = b; p2 = p2->Next;
- }
- *px = malloc(sizeof(**px));
- (*px)->Data = v;
- (*px)->Next = NULL;
- px = &(*px)->Next;
- }
- while(p1) {
- *px = malloc(sizeof(**px));
- (*px)->Data = p1->Data;
- (*px)->Next = NULL;
- p1 = p1->Next;
- px = &(*px)->Next;
- }
- while(p2) {
- *px = malloc(sizeof(**px));
- (*px)->Data = p2->Data;
- (*px)->Next = NULL;
- p2 = p2->Next;
- px = &(*px)->Next;
- }
- return L;
- }
- #else
- List Merge(List L1, List L2) {
- List head, temp;
- //head = temp = (List)malloc(sizeof(struct Node));
- head = temp = malloc(sizeof(*head));
- List L1_bak = L1;
- List L2_bak = L2;
- L1 = L1->Next;
- L2 = L2->Next;
- while(L1 && L2) {
- if(L1->Data <= L2->Data) {
- temp->Next = L1;
- L1 = L1->Next;
- } else {
- temp->Next = L2;
- L2 = L2->Next;
- }
- temp = temp->Next;
- }
- if(L1) {
- while(L1) {
- temp->Next = L1;
- L1 = L1->Next;
- temp = temp->Next;
- }
- temp->Next = NULL;
- }
- else if(L2) {
- while(L2) {
- temp->Next = L2;
- L2 = L2->Next;
- temp = temp->Next;
- }
- temp->Next = NULL;
- } else
- temp->Next = NULL;
- // 到这里L1 L2为NULL 运行到后面在main函数里打印出L1 L2为原始头节点。。
- L1_bak->Next = NULL;
- L2_bak->Next = NULL;
- return head;
- }
- #endif
复制代码
|
|