关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。相关的知识,希望对你有一定的参考价值。
(问题原题如下,知道任何一题都可回答)(回答的好一题加100分)谢谢。。。。。
链表(每一功能用一函数实现):
1.先建立两个有序的单链表,再将其合并成一个有序的单链表。。
2.先建立一若干个结点构成的单链表,统计其中数据域值为x的结点的个数,再对该单链表进行复制。。。。。
using namespace std;
struct NODE
int data;
NODE *next;
;
void dataAdd(NODE *(&list),int data) //在链表尾增加一个新的节点
NODE *newNode,*p;
newNode=new NODE;
newNode->data=data;
p=list;
if(!p) //如果list为空,头结点赋值为当前值
list=newNode;
list->next=NULL;
return ;
while(p->next)
p=p->next;
p->next=newNode;
newNode->next=NULL;
void inputData(NODE *(&list))
int data;
cin>>data;
while(!cin.fail())
dataAdd(list,data);
cin>>data;
cin.clear();
cin.sync();
int lastData(NODE *list)
NODE *p=list;
if(!p)
return -1;
while(p->next)
p=p->next;
return p->data;
void sortList(NODE *(&list))
NODE *p,*q;
p=list;
int temp;
while(p->next)
q=p->next;
while(q)
if(p->data>q->data)
temp=p->data;
p->data=q->data;
q->data=temp;
q=q->next;
p=p->next;
void combination(NODE *list1,NODE *list2,NODE *(&list3))
NODE *p=list1;
NODE *q=list2;
while(p && q)
if(p->data < q->data )
if(lastData(list3)!=p->data)
dataAdd(list3,p->data);
p=p->next;
else if(p->data > q->data)
if(lastData(list3)!=q->data)
dataAdd(list3,q->data);
q=q->next;
else if(p->data == q->data)
if(lastData(list3)!=p->data)
dataAdd(list3,p->data);
p=p->next;
q=q->next;
while(p)
if(lastData(list3)!=p->data)
dataAdd(list3,p->data);
p=p->next;
while(q)
if(lastData(list3)!=q->data)
dataAdd(list3,q->data);
q=q->next;
void showList(NODE *list) //显示链表中的数据
NODE *p;
p=list;
while(p)
cout<<p->data<<' ';
p=p->next;
cout<<endl;
int main()
NODE *list1=NULL,*list2=NULL;
cout<<"请输入链表1的数据,非数字字符为结束符!"<<endl;
inputData(list1);
sortList(list1); //list1排序
//showList(list1);
cout<<endl;
cout<<"请输入链表2的数据,非数字字符为结束符!"<<endl;
inputData(list2);
sortList(list2); //list2排序
NODE *list3=NULL;
cout<<"list1和list2的并集为:"<<endl;
combination(list1,list2,list3);
showList(list3);
cout<<endl;
return 0;
参考技术A //测试示例如下:************************
//请选择题目1或2:1
//输入链表a节点数目:4
//输入第1个节点的数据:3
//输入第2个节点的数据:6
//输入第3个节点的数据:2
//输入第4个节点的数据:6
//打印出所有编号: 2 3 6 6
//输入链表b节点数目:5
//输入第1个节点的数据:3
//输入第2个节点的数据:6
//输入第3个节点的数据:1
//输入第4个节点的数据:4
//输入第5个节点的数据:7
//打印出所有编号: 1 3 4 6 7
//合并链表a与b:打印出所有编号: 1 2 3 3 4 6 6 6 7
//请选择题目1或2:2
//输入链表c节点数目:7
//输入第1个节点的数据:4
//输入第2个节点的数据:7
//输入第3个节点的数据:3
//输入第4个节点的数据:7
//输入第5个节点的数据:2
//输入第6个节点的数据:1
//输入第7个节点的数据:7
//打印出所有编号: 1 2 3 4 7 7 7
//输入欲查找的节点:7
//该节点在链表c中的个数为:3
//输入欲查找的节点:6
//该节点在链表c中的个数为:0
//输入欲查找的节点:4
//该节点在链表c中的个数为:1
//输入欲查找的节点:9999
//该节点在链表c中的个数为:0
//复制链表c:打印出所有编号: 1 2 3 4 7 7 7
#include "stdafx.h"
#include <stdio.h>
#include <assert.h>
#define ElType int
typedef struct NumNode
ElType m_data;
struct NumNode *m_next;
NumNode;
NumNode *CreateList(NumNode *phead,const int n );
void PrintTest(NumNode *phead);
NumNode *GetNode(NumNode *next,const ElType &item);
void InsertFront(NumNode * &head, ElType &item);
void InsertOrder(NumNode * &head,ElType &item);
NumNode *MergeList(NumNode *head1,NumNode *head2);
int FindData(NumNode * &head,const ElType &item);
NumNode *CopyList(NumNode * &head);
void TestList1();
void TestList2();
void TestList1()
NumNode *pha, *phb;
pha = NULL;
phb = NULL;
int size_a,size_b;
printf("输入链表a节点数目:");
scanf("%d",&size_a);
pha = CreateList(pha,size_a);
PrintTest(pha);
printf("输入链表b节点数目:");
scanf("%d",&size_b);
phb = CreateList(phb,size_b);
PrintTest(phb);
printf("合并链表a与b:");
PrintTest(MergeList(pha,phb));
void TestList2()
NumNode *phc;
phc = NULL;
int size_c,item;
printf("输入链表c节点数目:");
scanf("%d",&size_c);
phc = CreateList(phc,size_c);
PrintTest(phc);
do
printf("输入欲查找的节点:");
scanf("%d",&item);
printf("该节点在链表c中的个数为:%d\n",FindData(phc,item));
while(9999 != item);
printf("复制链表c:");
PrintTest( CopyList(phc) );
NumNode *CopyList(NumNode * &head)
NumNode *copyHead, *curr;
assert(NULL !=head);
curr = head;
copyHead = NULL;
while(NULL != curr)
InsertOrder(copyHead,curr->m_data);
curr = curr->m_next;
return copyHead;
int FindData(NumNode * &head,const ElType &item)
NumNode *curr = head;
int num = 0;
while(NULL != curr)
if(item == curr->m_data)
num++;
curr = curr->m_next;
return num;
NumNode *MergeList(NumNode *head1,NumNode *head2)
NumNode *phc, *pha, *phb, *head;
pha = head1;
phb = head2;
if(pha->m_data < phb->m_data)
head = phc = pha;
pha = pha->m_next;
else
head = phc = phb;
phb = phb->m_next;
while(NULL != pha && NULL != phb)
if(pha->m_data < phb->m_data)
phc->m_next = pha;
phc = pha;
pha = pha->m_next;
else
phc->m_next = phb;
phc = phb;
phb = phb->m_next;
if(NULL != pha)
phc->m_next = pha;
else
phc->m_next = phb;
return head;
NumNode *CreateList(NumNode *phead,const int n )
int i;
ElType item;
for(i = 0; i<n; ++i)
printf("输入第%d个节点的数据:",i+1);
scanf("%d",&item);
InsertOrder(phead,item);
return phead;
void InsertOrder(NumNode * &head,ElType &item)
NumNode *prior, *curr, *newnode;
prior = NULL;
curr = head;
while(NULL != curr)
if(item < curr->m_data)
break;
else
prior = curr;
curr = curr->m_next;
if(NULL == prior)
InsertFront(head,item);
else
newnode = GetNode(NULL,item);
newnode->m_next = prior->m_next;
prior->m_next = newnode;
NumNode *GetNode(NumNode *next,const ElType &item)
NumNode *newnode = (NumNode *)malloc(sizeof(NumNode));
assert(NULL != newnode);
newnode->m_data = item;
newnode->m_next = next;
return newnode;
void InsertFront(NumNode * &head, ElType &item)
head = GetNode(head,item);
void PrintTest(NumNode *phead)
printf("打印出所有编号:"); //检测数据输入是否有误
NumNode *pTmp = phead;
while(pTmp != NULL)
printf("%4d",pTmp->m_data);
pTmp = pTmp->m_next;
printf("\n");
void main()
int i;
do
printf("请选择题目1或2:");
scanf("%d",&i);
switch(i)
case 1:
TestList1();
break;
case 2:
TestList2();
break;
default :
break;
while(-1 != i);
参考技术B 问题一
#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
int data;
struct Lnode *next;
Lnode,*Linklist;
void Greatlist(Linklist &L,int t);
void List_L(Linklist &ha,Linklist &hb);
void main()
int n,m;
struct Lnode *ha,*hb;
printf("输入a的结点个数:");
scanf("%d",&n);
printf("输入a的结点数据:\n");
Greatlist(ha,n);
printf("输入b的结点个数:");
scanf("%d",&m);
printf("输入b的结点数据:\n");
Greatlist(hb,m);
List_L(ha,hb);
printf("输出合并后的链表:\n");
while(ha!=NULL)
printf("%d ",ha->data);ha=ha->next;
void Greatlist(Linklist &L,int t)
int i;
struct Lnode *p,*q;
L=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&L->data);////先建一个结点
L->next=NULL;
q=L;
for(i=1;i<t;i++)
p=(Linklist)malloc(sizeof(Lnode));/////生成新结点
scanf("%d",&p->data);
p->next=NULL;
q->next=p;
q=q->next;
void List_L(Linklist &ha,Linklist &hb)
struct Lnode *pa,*pb,*pc,*la;
pa=ha;pb=hb;la=ha;
if((pa->data)>(pb->data))
pc=(Linklist)malloc(sizeof(Lnode));
pc->data=pb->data;
pc->next=la;
ha=pc;
pb=pb->next;
while(pa&&pb)
if((pa->data)<(pb->data))
la=pa;pa=pa->next;
else if((pa->data)>(pb->data))
pc=(Linklist)malloc(sizeof(Lnode));
pc->data=pb->data;
pc->next=la->next;
la->next=pc;
pb=pb->next;
else pb=pb->next;
if(pb)
la->next=pa?pa:pb;///插入剩余段
以上是关于关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。的主要内容,如果未能解决你的问题,请参考以下文章