永发信息网

将两个有序线性表合并成一个有序线性表,用C语言 在线急等!!!!

答案:4  悬赏:60  手机版
解决时间 2021-11-15 11:24
将两个有序线性表合并成一个有序线性表,用C语言 在线急等!!!!
最佳答案
//---------------------------------------------------------------------------

#include
#include

typedef struct tagStruNode
{
int val;
tagStruNode * pNext;
}STRU_NODE, *PSTRU_NODE;

//打印链表
void PrintLink(const PSTRU_NODE pLink)
{
PSTRU_NODE p = pLink;
while(NULL != p )
{
printf("%d,", p->val);
p = p->pNext;
}

printf("\n");
}

//将节点加入到一个增序排列的链表中
void AddNodeToLinkByInc(PSTRU_NODE * pLink, int val)
{
PSTRU_NODE p1 = *pLink;
PSTRU_NODE p2 = *pLink;

while(NULL != p1)
{
if(p1->val > val)
{
PSTRU_NODE pNew = (PSTRU_NODE)malloc(sizeof(STRU_NODE));
pNew->val = val;
if(p1 == p2) //加入到头节点
{
*pLink = pNew;
pNew->pNext = p1;
}
else
{
p2->pNext = pNew;
pNew->pNext = p1;
}

break;
}

p2 = p1;
p1 = p1->pNext;
}

if(NULL == p1)
{
PSTRU_NODE pNew = (PSTRU_NODE)malloc(sizeof(STRU_NODE));
pNew->val = val;
pNew->pNext = NULL;

if (NULL == * pLink) //头节点为NULL
{
*pLink = pNew;
}
else //加入到尾部
{
p2->pNext= pNew;
}

return;
}
}

//清除链表
void ClearLink(PSTRU_NODE pLink)
{
PSTRU_NODE p = pLink;
PSTRU_NODE p1 = NULL;
while(NULL != p)
{
p1 = p->pNext;
free(p);
p = p1;
}
}

//组合两个有序链表(增序)
PSTRU_NODE Combine(PSTRU_NODE pLink1, PSTRU_NODE pLink2)
{
PSTRU_NODE pL1 = pLink1;
PSTRU_NODE pL2 = pLink2;

PSTRU_NODE pOutLink = NULL;
while(NULL != pL1)
{
AddNodeToLinkByInc(&pOutLink, pL1->val);
pL1 = pL1->pNext;
}

while(NULL != pL2)
{
AddNodeToLinkByInc(&pOutLink, pL2->val);
pL2 = pL2->pNext;
}

return pOutLink;
}

int main()
{
PSTRU_NODE pLink1 = NULL;
PSTRU_NODE pLink2 = NULL;
PSTRU_NODE pCombineLink = NULL;

for(int i = 0; i < 5; i++)
{
AddNodeToLinkByInc(&pLink1, i);
AddNodeToLinkByInc(&pLink2, i + 5);
}

PrintLink(pLink1);
PrintLink(pLink2);

pCombineLink = Combine(pLink1, pLink2);
PrintLink(pCombineLink);

ClearLink(pLink1);
ClearLink(pLink2);
ClearLink(pCombineLink);

return 0;
}
全部回答
楼主是不是信管的= =
代码写好了。
经测试VC下通过。
#include

int merge(int *a,int n1,int *b,int n2,int *s)
{
int i=0,j=0,k=0;
while(i {
if(a[i]>b[j]){
if(k&&s[k-1]==b[j])//有重复元素
j++;
else
s[k++]=b[j++];
}
else{
if(k&&s[k-1]==a[i])//有重复元素
i++;
else
s[k++]=a[i++];
}
}
while(i if(k&&s[k-1]==a[i])
i++;
else
s[k++]=a[i++];
}
while(j if(k&&s[k-1]==b[j])//有重复元素
j++;
else
s[k++]=b[j++];
}
return k;
}
int main()
{
int a[100],b[100],s[200],n1,n2,i,n3;
printf("输入第一个数组元素个数:");
scanf("%d",&n1);
printf("输入%d个升序元素(空格隔开):",n1);
for(i=0;i scanf("%d",&a[i]);
printf("输入第二个数组元素个数:");
scanf("%d",&n2);
printf("输入%d个升序元素(空格隔开):",n2);
for(i=0;i scanf("%d",&b[i]);
n3=merge(a,n1,b,n2,s); //a和b数组的元素合并到s数组里去(并消除重复元素),并返回合并后数组的元素个数
printf("合并后元素数组为:");
for(i=0;i printf("%d ",s[i]);
printf("\n");
return 0;
}
附测试数据一组:
5
3 50 50 100 100
3
8 50 80
输出为:3 8 50 80 100
#include
#include

struct TLink {
int data;
struct TLink * next;
};


struct TLink * new_item(int number)
{
struct TLink * r = 0;
r = (struct TLink *)malloc(sizeof(struct TLink));
r->data = number;
r->next = 0;
return r;
}


struct TLink * lookup(struct TLink * root, int number)
{
struct TLink * h = root;
while(h) {
if (h->data == number) return h;
h = h->next ;
}
return 0;
}


void append(struct TLink * * root, int number)
{
struct TLink * r = 0, * n = 0;
if (!root) return ;


if (lookup(*root, number)) return;


r = *root;
if (!r) {
*root = new_item(number);
return ;
}


if (number < r->data ) {
n = new_item(number);
n->next = r;
*root = n;
return ;
}


while(r) {
n = r->next ;


if (!n) {
n = new_item(number);
r->next = n;
return ;
}


if (number < n->data ) {
r->next = new_item(number);
r->next->next = n;
return ;
}
r = n;
}
}


void print(struct TLink * root)
{
struct TLink * r = root;
printf("【");
while(r) {
printf("%d ", r->data );
r = r->next ;
}
printf("\b】\n");
}


void merge(struct TLink ** h0, struct TLink ** h1)
{
struct TLink * h = 0, * k = 0;
if (!h0 || !h1) return ;
h = *h1;
while(h) {
append(h0, h->data );
k = h;
h = h->next ;
free(k);
}
h1 = 0;
}

int main(void)
{
int i = 0; struct TLink * x=0, *y = 0;
int a[] = {8,4,3,9,5,1};
int b[] = {7,2,1,5,6,0};
printf("原数据为:\n数组A:【");
for(i = 0; i < 6; i++) {
printf("%d ", a[i]);
append(&x, a[i]);
}
printf("\b】\n数组B:【");
for(i = 0; i < 6; i++) {
printf("%d ", b[i]);
append(&y, b[i]);
}
printf("\b】\n转换为有序线性表\nA:");
print(x);
printf("B:");
print(y);
printf("AB合并后为:");
merge(&x, &y);
print(x);
return 0;
}

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
20减5分之6爱渴死等于5
尾椎酸是什么原因女生
英伟达电竞生活馆地址好找么,我有些事要过去
穿着这样的连体舞蹈练功服用穿着胸罩和内裤吗
求校阅女孩百度云资源
跳水节目验真容 杨幂柳岩你们敢来吗
腹腔0.6的水算腹水吗
乳山银滩家庭旅馆地址在哪,我要去那里办事,
皂粉和洗衣粉的区别
谜语“五更斜月挂城头”谜底解谜
如何回答地理“分布规律”问题高中地理题
死面饼室温放多长时间就不能吃了?室温大概20
吃了丁土豆舌头向针扎一样用什么能解
请问,建设光伏电站都需要什么手续,多少手续
电动车战速和小猴子那个比较好 高中上学骑的
推荐资讯
小男孩不小心刮坏了豪车被车主扇耳光,结果孩
求《lost the way》的中文歌词,只要中文,不
知道体积后怎么计算密度和重量
求一篇科幻世界译文版里的小说
求诛仙,仙焚香,各种护符功用介绍
若把200g10的氯化钠溶液平分成两份,向其中一
最后得数是多少
真爱不是犯贱和是真爱才会犯贱,怎么解释
k552次列车和K1183次列车都经过济南的哪个火
27.5的山地车配轮组要多大的合适
梦幻网络地址在哪,我要去那里办事,
Oracle中触发器的问题
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?