求教如何合并两个链表以及释放内存
- C/C++ code
#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define MC (Count *)malloc(sizeof(struct Count));struct Count{ int Val;//系数 int Last;//指数 struct Count * pNext;};//造链表并赋值struct Count * Make (void){ int val; int last; int len;//链表长度 int i; struct Count * pHead = MC//头指针 if (pHead == NULL) { printf("分配内存失败!\n"); exit(-1); } struct Count * pList = MC//结点 pList = pHead; pList->pNext = NULL; printf("的项数为:"); scanf("%d",&len); for (i=0;i<len;++i) { printf("第%d项为(系数,指数):",i+1); scanf("%d,%d",&val,&last); struct Count * pNew = MC if (pHead == NULL) { printf("分配内存失败!\n"); exit(-1); } pNew->Val = val; pNew->Last = last; pList->pNext = pNew; pNew->pNext = NULL; pList = pNew; } return pHead;}//列出多项式void List(Count * pHead){ struct Count * p = pHead->pNext; while (p!=NULL) { printf("(%dX^%d)",p->Val,p->Last); p = p->pNext; if (p!=NULL) putchar('+'); } putchar('\n'); return;}//多项式相加处理struct Count * Add (Count * pHead_1,Count * pHead_2){ pHead_1 = pHead_1->pNext; while (pHead_1 != NULL) { pHead_1 =pHead_1->pNext; if (pHead_1->pNext == NULL) { pHead_1->pNext = pHead_2; break; } } return pHead_1;}int main (void){ struct Count * phead_1 = NULL; struct Count * phead_2 = NULL; struct Count * phead_add = NULL; printf("\n多项式<1>"); phead_1 = Make(); printf("\n你输入的多项式为:\n"); List(phead_1); printf("\n多项式<2>"); phead_2 = Make(); printf("\n你输入的多项式为:\n"); List(phead_2); phead_add = Add (phead_1,phead_2); printf("\n多项式的和为:\n"); List(phead_add); return 0;}/*在VC++6.0运行结果是:多项式<1>的项数为:2第1项为(系数,指数):3,3第2项为(系数,指数):4,2你输入的多项式为:(3X^3)+(4X^2)多项式<2>的项数为:2第1项为(系数,指数):2,4第2项为(系数,指数):5,4你输入的多项式为:(2X^4)+(5X^4)多项式的和为:(-842150451X^-842150451)+(2X^4)+(5X^4)Press any key to continue*/[解决办法]
3个问题
1、Add 函数返回的指针不是表1的头节点,而是表1的尾节点(实际上不需要返回,Add函数声明为 void 都行)
2、main函数中,List调用传入的参数应该是phead_1
3、Add 函数中,连接两个链的时候,pHead_1->pNext = pHead_2,实际上是把表2的头节点也链进去了,应该跳过表2的头节点链表2的第一个数据节点:pHead_1->pNext = pHead_2->pNext
[解决办法]
如果是链表连接,就无需释放,都仍是在使用的。