关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。相关的知识,希望对你有一定的参考价值。

(问题原题如下,知道任何一题都可回答)(回答的好一题加100分)谢谢。。。。。

链表(每一功能用一函数实现):
1.先建立两个有序的单链表,再将其合并成一个有序的单链表。。
2.先建立一若干个结点构成的单链表,统计其中数据域值为x的结点的个数,再对该单链表进行复制。。。。。

#include <iostream>

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语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。的主要内容,如果未能解决你的问题,请参考以下文章

课程设计|C++实现两个链表的合并

C语言链表问题,作业编程。编好出现问题。高手看下。

C语言链表问题

高分求助一道C语言设计题 不难!!

c语言关于链表的一道题

C语言问题,求解释(关于动态链表和文件写入):