单链表实现一元多项式相加请帮我看一下这个程序有什么错误,#include #include #include #incl

zyhuang2022-10-04 11:39:541条回答

单链表实现一元多项式相加
请帮我看一下这个程序有什么错误,
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct LNode
{ /*多项式的存储结构定义*/
int coef;
int expn;
struct LNode *next;
}LNode,*polynomail;
void creatpolyn(polynomail &p,int m)
{
int i;
int coef;
int expn;
polynomail s;
p=(polynomail)malloc(sizeof(LNode));
p->next = NULL;
for(i=1;icoef,s->expn);
printf("n");
s->coef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
}//CreatPolyn
void addpolyn(polynomail &pa,polynomail &pb)
{
polynomail qa,qb,c,pc;
pc=(polynomail)malloc(sizeof(LNode));
pc->next=NULL;
qa=pa->next;
qb=pb->next;
while(qa&&qb)
{
if(qa->expn=qb->expn)
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=pa->expn;
c->coef=qa->coef+qb->coef;
c->next=NULL;
qa=qa->next;
qb=qb->next;
}
if(qa->expn>qb->expn)
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=qa->expn;
c->coef=qa->coef;
c->next=NULL;
qa=qa->next;
}
if(qa->expnexpn)
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=qb->expn;
c->coef=qb->coef;
c->next=NULL;
qb=qb->next;
}
pc->next=c;
pc=c;
}//while
if(qa)
c->next=qa;
else
c->next=qb;
}//AddPolyn
void printpolyn(polynomail p)
{
while(p->next!=NULL)
{
p=p->next;
printf(" %g*x^%d",p->coef,p->expn);
}
}
int main()
{
int n,m;
polynomail pa,pb;
printf("请输入一元多项式pa的项数:");
scanf("%dn",n);
printf("n");
creatpolyn(&pa,n);
printf("请输入一元多项式pb的项数:");
scanf("%dn",m);
printf("n");
creatpolyn(&pb,m);
addpolyn(&pa,&pb);
printf("结果是:pa+pb=");
printpolyn(pa);
printf("n");
return 0;
}

已提交,审核后显示!提交回复

共1条回复
烟飞人散 共回答了26个问题 | 采纳率84.6%
我希望你能给我加分啥,我帮你调试了大概2个小时了.
这程序是不是你写的?
如果是的话,希望你好好加强C的基本功,很多思想上和语法上的问题.
其实我也不是帮你改,基本上我帮你重写了.
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct LNode
{ /*多项式的存储结构定义*/
int coef;
int expn;
struct LNode *next;
}LNode,*polynomail;
void creatpolyn(polynomail &p,int m)
{
printf("creatpolyncreatpolyncreatpolyncreatpolynyn");
int i;
int coef;
int expn;
polynomail s;
p=(polynomail)malloc(sizeof(LNode));
p->next=NULL;
for(i=1;icoef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
}//CreatPolyn
polynomail addpolyn(polynomail &pa,polynomail &pb)
{
polynomail c,pc;
pc=(polynomail)malloc(sizeof(LNode));
pc->next=NULL;
pa=pa->next;
pb=pb->next;
while(pa && pb)
{
if((pa->expn)==(pb->expn))
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=pa->expn;
c->coef=((pa->coef)+(pb->coef));
pa=pa->next;
pb=pb->next;
} //if
else if((pa->expn)>(pb->expn))
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=pb->expn;
c->coef=pb->coef;
pb=pb->next;
} //if
else
{
c=(polynomail)malloc(sizeof(LNode));
c->expn=pa->expn;
c->coef=pa->coef;
pa=pa->next;
} //if
c->next=pc->next;
pc->next=c;
}//while
if(!pa && pb)
{ while(c->next!=NULL)
{
c=c->next;
}//while
c->next=pb; }
if(!pb && pa)
{ while(c->next!=NULL)
{
c=c->next;
}//while
c->next=pa;}
return pc;
}//AddPolyn
void printpolyn(polynomail &p)
{
while(p->next!=NULL)
{ printf("test_print");
p=p->next;
printf(" %dX^%d+ ",p->coef,p->expn);
printf("n");
}//while
}//printpolyn
void main(void)
{
int n,m;
polynomail pa,pb,pc;
printf("请输入一元多项式pa的项数:");
scanf("%d",&n);
creatpolyn(pa,n);
printf("请输入一元多项式pb的项数:");
scanf("%d",&m);
creatpolyn(pb,m);
pc=addpolyn(pa,pb);
printf("结果是:pa+pb=n");
printpolyn(pc);
}
1年前

相关推荐

设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是( ).
设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是( ).
(A)head==0
(B) head->next==0
(C)head->next==head
(D)head!=0
我觉得是选C 但仅仅是单纯的觉得 这个空和 0不一样才对
求详解这个空链表的特性
kurtlian1年前1
ycruisen 共回答了19个问题 | 采纳率100%
B
没有头结点说明第一个元素是head->next
而它是空的,那么就判断是否 == NULL,即0
所以B
关于数据结构单链表的题,给定两个多项式,实现多项式的相加算法,
joey_guan1年前1
上帝是个xx 共回答了18个问题 | 采纳率88.9%
这是Java的:
public class Test {
public static void main(String[] args) {
try{
LinkList list1 = new LinkList();
LinkList list2 = new LinkList();
LinkList list3 = null;

list1.addAt(0, new Item(1, 5));
list1.addAt(1, new Item(-1.5, 3));
list1.addAt(2, new Item(1, 1));

list2.addAt(0, new Item(0.5, 5));
list2.addAt(1, new Item(0.5, 4));
list2.addAt(2, new Item(1.5, 3));
list2.addAt(3, new Item(3, 0));

list3 = mergeLinkList(list1, list2);

System.out.println("一元多项式的相加过程:");
list1.listAll();
System.out.println(" + ");
list2.listAll();
System.out.println(" = ");
list3.listAll();
}
catch(Exception e){
e.printStackTrace();
}
}

//两个一元多项式相加,返回新的一元多项式
public static LinkList mergeLinkList(LinkList list1, LinkList list2){
int i = 0;
Item item = new Item();
Node curr1, curr2;
LinkList list3 = new LinkList();

curr1 = list1.getHead().getNext();
curr2 = list2.getHead().getNext();
while(curr1 != null && curr2 != null){
if(curr1.getData().getExp() > curr2.getData().getExp()){
item = curr1.getData();
list3.addAt(i, item);
curr1 = curr1.getNext();
i++;
}
else if(curr1.getData().getExp() < curr2.getData().getExp()){
item = curr2.getData();
list3.addAt(i, item);
curr2 = curr2.getNext();
i++;
}
else{
item = new Item(curr1.getData().getCoef() + curr2.getData().getCoef(), curr1.getData().getExp());
if(item.getCoef() != 0){
list3.addAt(i, item);
i++;
}
curr1 = curr1.getNext();
curr2 = curr2.getNext();
}
}
while(curr1 != null){
item = curr1.getData();
list3.addAt(i++, item);
curr1 = curr1.getNext();
}
while(curr2 != null){
item = curr2.getData();
list3.addAt(i++, item);
curr2 = curr2.getNext();
}

return list3;
}
}
/**
* 一元多项式的一般项类
*/
class Item{
private double coef; //一元多项式的一般项的系数
private int exp; //一元多项式的一般项的指数

public Item(){
this.coef = 0.0;
this.exp = 0;
}

public Item(double coef, int exp){
this.coef = coef;
this.exp = exp;
}

public double getCoef(){
return this.coef;
}

public void setCoef(double coef){
this.coef = coef;
}

public int getExp(){
return this.exp;
}

public void setExp(int exp){
this.exp = exp;
}
}
/**
* 链表结点类
*/
class Node{
private Item data;
private Node next; //链表结点的指针域,指向直接后继结点

public Node(){
data = null;
next = null;
}

public Node(Item data, Node next){
this.data = data;
this.next = next;
}

public Item getData(){
return this.data;
}

public void setData(Item data){
this.data = data;
}

public Node getNext(){
return this.next;
}

public void setNext(Node next){
this.next = next;
}
}
/**
* 链表类
*/
class LinkList{
private Node head = null; //头结点指针
private int size = 0;

public LinkList(){
head = new Node();
size = 0;
}
//在i位置插入元素elem
public boolean addAt(int i, Item elem) {
if(i < 0 || i > size){
return false;
}
Node pre,curr;
int pos;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = new Node(elem, pre.getNext());
pre.setNext(curr);
size++;
return true;
}

//删除i位置的元素
public boolean removeAt(int i) {
if(i < 0 || i >= size){
return false;
}

Node pre,curr;
for(pre=head; i>0 && pre.getNext()!=null; i--,pre=pre.getNext());
curr = pre.getNext();
pre.setNext(curr.getNext());
size--;
return true;
}

//根据值value查询结点是否存在,若存在返回位置,否则返回-1
public int findByValue(Item value){
Node curr;
int pos;
for(pos=0,curr=head.getNext(); curr!=null; pos++,curr=curr.getNext()){
if(curr.getData().toString().equals(value.toString())){
break;
}
}

if(curr==null){
return -1;
}
return pos;
}

public Node getHead(){
return this.head;
}

public void setHead(Node head){
this.head = head;
}

public int getSize(){
return this.size;
}

public boolean isEmpty(){
return (size==0);
}

public void listAll(){
for(Node curr=head.getNext(); curr!=null; curr=curr.getNext()){
System.out.print("(" + curr.getData().getCoef() + ", " + curr.getData().getExp() + ")t");
}
System.out.println();
}
}
给定n个元素的向量,逐个取出该向量中元素的值,建立一个有序单链表的时间复杂度是多少,
蜡笔小欣爱扬1年前2
tclzcja 共回答了25个问题 | 采纳率84%
n(n-1)/2
第一个数,0次查找
第二个数,1次查找
...
第n个数,n-1次查找
所以总共为:
(n-1+1)(n-1)/2=n(n-1)/2
数据结构高手进,安徽电大数据结构期末试题一一、单选题(每小题3分,共30分)1、对于单链表形式的队列,队空的条件是( )
数据结构高手进,
安徽电大数据结构期末试题一
一、单选题(每小题3分,共30分)
1、对于单链表形式的队列,队空的条件是( )
A、F=R=NULL B、 F=R C、 F≠NULL且R=NULL D、 R-F=1
2、下述排序算法中,稳定的是( ).
A、直接选择排序 B、 表插入排序 C、快速排序 D、堆排序
3、四组含C1~C7的结点序列中,哪一种是下列有向图的拓扑序列( ).
A、 C1,C2,C6,C7,C5,C4,C3 B、 C1,C2,C6,C3,C4,C5,C7
C、 C1,C4,C2,C3,C5,C6,C7 D、 C5,C7,C4,C1,C2,C6,C3
4、下列广义表中,深度为2的有( ).
A、(a,b) B、((c,(a,b)),d)
C、 (c,(a,b)) D、 ((a,b),(c,(a,b)))
5、从一个顺序队列删除元素时,首先要( ).
A、 前移一位队首指针
B、 后移一位队首指针
C、 取出队首指针所指位置上的元素
D、 取出队尾指针所指位置上的元素
6、设一个广义表中结点的个数为n,则广义表深度算法的时间复杂度为 .
A、 O(1)
B、 O(n)
C、 O(n2)
D、 O(Log2N)
7、度为h的满二叉树(仅含根结点的二叉树高度为零)的结点最少是多少( )
A、h+1
B、2h+1
C、2h+1-1
D、2h
8、5个不同的数据元素进行直接插入排序,最多需要进行( )次比较.
A、8 B、10 C、15 D、25
9、链表表示线性表的优点是( )
A、便于随机存取
B、花费的存储空间比顺序表少
C、便于插入与删除
10、一棵具有5层满二叉树中节点总数为( ).
A、31 B、32 C、33 D、16
二、填空题(每题2分,共30分)
1.从逻辑结构看,线性表是典型的 ,树是典型的 .
2.设有二维数组A[0..9,0..19],其每个元素占两个字节,第一个元素的存储地址为100,若按行优先顺序存储,则元素A[6,6]的存储地址为 ,按列优顺序存储,元素A[6,6]的存储地址为 .
3.若按层次顺序将一棵有n个结点的完全二叉树的所有结点从1到n编号,那么当i为 且小于n时,结点I的右兄弟是结点 ,否则结点i没有右兄弟.
4、含有2n个结点的二叉树高度至少是 ,至多是 (仅含根结点的二叉树高度为零).
5、起泡法对n个关键码排序,在最好情况下,只需做 次比较和 次移动;在最坏的情况下要做 次比较.
6、栈是一种 表.队列又称为 表.
7、一个广义表的元素分为 和 两类.
三、判断题(每小题2分,
1、栈是一种线性结构.( )
2、顺序表中所有结点的类型必须相同.( )
3、链接表中所有灵活利用存储空间,所以链表都是紧凑结构.( )
4、任何无环的有向图,其结点都可以排在一个拓扑序列里.( )
5、用Ch1,Ch2表示两个字符,若Ord(Ch1)<Ord(Ch2),则称Ch1<Ch2.( )
四、简答、应用题(每题10分,共30分)
1、某二叉树的节点数据采用顺序存储表示如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
E
A
F
D
H
C
G
B
(1) 试画出此二叉树的图形表示;
(2) 写出节点d的双亲节点及左、右子女
(3) 将此二叉树看作森林的二叉树表示,试将它还原为森林
2、请简述散列函数在散列法存储中的作用,并举出一个散列函数的例子.
3、 请画出下面广义表相应的加入表头结点的单链表表示,D(A(x,y,L(a,b)),B(z,A(x,y,L(a,b)))).
错的别发啊 求求各位大虾拉、、
today11301年前1
胡isa完美苍蝇 共回答了23个问题 | 采纳率82.6%
一、
1、B
2、B
4、C 《 A的深度为1,B的深度为3,D的深度为3》
5、C
6、B?
7、C
8、B 直接插入排序 :n个不同的数据元素,最多需要比较n*(n-1)/2
9、C
10、A
二、
1.线性结构 ,非线性结构 .
2.352 < 100+ (6*20+6)*2 > ,232 < 100+ (6*10+6)*2> .
3.i能被2整除,i+1
4、log2(2n+1) ,2n-1
5、n-1 0 n*(n-1)/2
6、只在栈顶进行操作 插入删除受限.
7、子表 数据元素
三、
1、对
2、错 数组中的元素必须 类型相同
3、错
4、错 拓扑序列不唯一
5、用Ch1,Ch2表示两个字符,若Ord(Ch1)<Ord(Ch2),则称Ch1<Ch2.( )
已知指针 p 指向某单链表中的一个结点,则判别该结点有且仅有一个后继结点的条件是什么
zm76111年前1
清风识字不翻书 共回答了14个问题 | 采纳率100%
p->next!=NULL&&p->next->next=NULL
设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法 :
设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法 :
x05(1)确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列{4,5,7,7,8,10,11,15,15,16,17,20,20}中比10大的数有5个);
x05(2) 在单链表将比正整数x小的数按递减次序排列;
x05(3) 将正整数(比)x大的偶数从单链表中删除.
黑衣人3483551281年前1
pangjuan1002 共回答了20个问题 | 采纳率95%
来空间看!
数据结构 算法设计题求助!设某单链表L的结点结构为(data,next),其中data域中存放一整数,next为指针.设
数据结构 算法设计题求助!
设某单链表L的结点结构为(data,next),其中data域中存放一整数,next为指针.设计一算法,判断该链表的元素值是否递增!
zz181年前1
jyuryu7 共回答了15个问题 | 采纳率86.7%
curr = L;
while ( curr->next != NULL)
{
if (curr->next->data < curr->data) return 0;
curr = curr->next;
}
return 1;
算法,指针,2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n.试写一算法将这两
算法,指针,
2.15 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n.试写一算法将这两个链表连接在一起,假设指针hc指向连接后的链表的头结点,并要求算法以尽可能短的时间完成连接运算.请分析你的算法的时间复杂度.
x05解:
void MergeList_L(LinkList &ha,LinkList &hb,LinkList &hc)
{
x05LinkList pa,pb;
x05pa=ha;
x05pb=hb;
x05while(pa->next&&pb->next){
x05x05pa=pa->next;
x05x05pb=pb->next;
x05}
x05if(!pa->next){
x05x05hc=hb;
x05x05while(pb->next) pb=pb->next;
x05x05pb->next=ha->next;
x05}
x05else{
x05x05hc=ha;
x05x05while(pa->next) pa=pa->next;
x05x05pa->next=hb->next;
x05}
}
不懂这题啊,虽然天气冷,请高手像我一样不怕打字.帮一步步解释哈,我太笨了,全不懂,还花了我两个小时思考,但却是我的心意.
rabbit_simon1年前1
yuss520 共回答了26个问题 | 采纳率96.2%
10点钟已从hi上解决,还没来得及贴上来.现在贴上
例如链表ha有元素:1、2、3、4、5
hb有元素:6、7、8
那么
while(pa->next&&pb->next){
pa=pa->next;
pb=pb->next;
}
初始pa指向元素1,pb指向元素6
第一次pa指向元素2,pb指向元素7
第三次pa指向元素3,pb指向元素8
第四次pa指向元素4,pb指向结尾了
就是先找出那个链表先到尾了,显然是hb
然后到了下面的if语句,pa->next 是有元素的,因此执行if里面的语句
把hb作为链表头,while(pb->next) pb=pb->next使得pb指向hb的尾部,将hb的尾部指针指向ha,因此两个链表连起来了
实验内容: 问题描述:已知递增有序的单链表A,编写算法实现向A中插入或删除一个元素,并保持A的有序性。实验要求: 1、
实验内容: 问题描述:已知递增有序的单链表A,编写算法实现向A中插入或删除一个元素,并保持A的有序性。实验要求: 1、 结点的数据均为整型。 2、 若表中已经存在此元素,则不插入
把人从dd中拉出1年前1
泪宜城浪人 共回答了22个问题 | 采纳率100%
这是大致算法,具体细节问题 自己慢慢改
typedef struct linklist{
int data;
linklist *next;
};
linklist B,C
B=C=A;
linklist temp; //表示要插入的数
while(B->next!=null)
{
if(temp->data>B->next->data)
{
C=B;
B=B->next;
}
else
{
temp->next=B;
C->next=temp;
}
}
线性表(a1,a2……an),对于查找第i个元素的运算,顺序表的时间复杂度为(),单链表的时间复杂度为()。
线性表(a1,a2……an),对于查找第i个元素的运算,顺序表的时间复杂度为(),单链表的时间复杂度为()。
A 0(i) B O(1) C 0(n) D 0(i-1)
huangxinneng1年前2
qiuyuekk 共回答了17个问题 | 采纳率76.5%
B C
顺序表就相当于数组,查找的时候可以一下就找到,所以时间复杂度为:O(1)
单链表查找的时候要一直找下一个结点,若要查找的元素在最后,就相当于找了n次,所以时间复杂度为:O(n)
求高手给算几道在算法设计题1.对给定的单链表L,编写一个删除L中值为x的结点的直接前趋结点的算法。2.有一个单链表(不同
求高手给算几道在算法设计题
1.对给定的单链表L,编写一个删除L中值为x的结点的直接前趋结点的算法。
2.有一个单链表(不同结点的数据域),其头指针为head,编写一个函数计算数据域为x的结点个数。
3.已知有两个单链表A和B,其头指针分别为heada和headb,编写一个函数从单链表A中删除自第i个元素起共len个元素,然后将它们插入到单链表B的第j个元素之前。
d_zone1年前1
铁音符 共回答了15个问题 | 采纳率86.7%
#include
using namespace std;
int fib(int t){
int a = 1;
int b = 1;
if(t= t) return next;
a = b;
b = next;
}
}
int main(){
cout
在一个具有n个结点的有序单链表中,插入一个新结点并仍然保持有序的算法时间复杂度是( ) A.O(1) B.O(n) C.
在一个具有n个结点的有序单链表中,插入一个新结点并仍然保持有序的算法时间复杂度是( ) A.O(1) B.O(n) C.O(n 2 ) D.O(nlog 2 n)
云心倾情1年前1
laohts 共回答了29个问题 | 采纳率96.6%
B
来个牛人帮我做题吧~1,假设有两个按元素值递增次序排列的线性表,均以单链表形式存储.请编写算法将这两个单链表归并为一个按
来个牛人帮我做题吧~
1,假设有两个按元素值递增次序排列的线性表,均以单链表形式存储.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表.
节点结构:
typedef struct node{
int data;
struct node *next;
} linknode,*link;
link Union(link la,lb)
2,typedef struct node
{int data; struct node *next;
}linknode,*link;
bool inclusion(link ha,link hb):boolean;
/*以ha和hb为头指针的带头节点单链表分别表示递增有序表A和B,本算法判别表A是否包含在表B内,若是,则返回“true”,否则返回“false”*/
{
pa=ha->next; pb=hb->next; (1) ;
while ((2) )
{
if (pa->data==pb->data )
(3);
else
(4) ;
}
(5) ;
}
littlefox01281年前0
共回答了个问题 | 采纳率
对于单链表表示法,以下说法错误的是()
对于单链表表示法,以下说法错误的是()
①数据域用于存储线性表的一个数据元素
②指针域或链域用于存放一个指向本结点所含数据元素的直接后继所在结点的指针
③所有数据通过指针的链接而组织成单链表
④NULL称为空指针,它不指向任何结点,只起标志作用
wanyangle1年前1
归来吾 共回答了14个问题 | 采纳率78.6%
3的话你可以举一个反例,比如说有1 2 3 三个节点 比如1连接2,1连接3 这样不就不是单链表了么
已知2个递增无序的单链表A,B分别存储了一个集合,请设计算法实现这2个集合的并集,
无情路过1年前1
retia123 共回答了20个问题 | 采纳率90%
递增无序?递增有序吧,如果无序,首先给两个链表排序,以下代码按升序合并
先剔除两条链表里的相同值,然后再合并
LinkList ElimtList(LinkList L)/* L为空头 *//* 剔除相同值 */
{
LinkList p = NULL;
LinkList t = NULL;
LinkList tmp = NULL;
p = L->next; /* 保存结点2 */
t = p->next; /* 保存结点3 */
while (NULL != t)/* 进入循环 */
{
if (p->num == t->num)
{
tmp = t->next;/* 保存结点t的下一个结点 */
p->next = tmp;/* 结点t的上一个结点与下一个结点相接 */
free(t); /* 释放结点t */
t = tmp; /* t指向下一个结点 */
}
else
{
p = p->next;/* 后移一位 */
t = t->next;/* 后移一位 */
}
}
return(L);
}
LinkList MergeList(LinkList L1,LinkList L2)/* 合并L1,L2两个链表,用的地址L1作为新链表地址返回 *//* 合并 */
{
LinkList p = NULL;
LinkList p1 = NULL;
LinkList p2 = NULL;
LinkList tmp = NULL;
p = L1;
p1 = L1->next;
p2 = L2->next;
while ((NULL != p1) && (NULL != p2))
{
if (p1->num < p2->num)/* 若p1的值小于p2的值,p1后移1位,p2不动 */
{
p = p1;
p1 = p1->next;
}
else if (p1->num > p2->num)/* 若p1的值大于p2的值,则p1前插入p2,p2后移1位,p1不动 */
{
tmp = p2->next;
p2->next = p1;
p->next = p2;
p = p2;
p2 = tmp;
}
else/* if (p1->num == p2->num) */
{
tmp = p2->next;/* 保存结点p2的下一个结点 */
free(p2); /* 释放结点p2 */
p2 = tmp; /* p2指向下一个结点 */
}
}
p->next = p1 p1 :p2; /*插入剩余段*/
free(L2); /*释放L2的头节点*/
return(L1);
}
已知两个单链表A与B分别表示两个集合,其元素类型为int且递增排列,其头结点指针分别为a,b.编写一个函数求出A和B的交
已知两个单链表A与B分别表示两个集合,其元素类型为int且递增排列,其头结点指针分别为a,b.编写一个函数求出A和B的交集,要求C同样以元素递增的单链表形式存
datoudadi1年前1
zhengdagui 共回答了21个问题 | 采纳率90.5%
void List_Insert(List A,List B,List &C)
{
int i=0,j=0,k=0;
while(A.elem[i]&&B.elem[j])
{
if(A.elem[i]B.elem[j]) j++;
if(A.elem[i]==B.elem[j])
{
C.elem[k++]=A.elem[i];
i++;
j++;
}
}
编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。
编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。
1)建立一个带头结点的单链表。
(2)计算单链表的长度,然后输出单链表。
(3)查找值为x的直接前驱结点q。
(4)删除值为x的结点。
(5)把单向链表中元素逆置(不允许申请新的结点空间)。
(6)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。
(7)在主函数中设计一个简单的菜单,分别测试上述算法
tianjihu1年前1
boshi675 共回答了17个问题 | 采纳率100%
typedef int Elemtype;
typedef int status;
#define OVERFLOW -2
#define OK 1
#define ERROR -1
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode {
Elemtype data;
struct LNode *next;
}*linklist;
//构造链表
void Create_Linklist(linklist &L)
{
linklist p;
p=(linklist)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW);
L=p;
L->next =NULL;
}
//节点插入
void Insert_Linklist(linklist &L)
{
linklist p;
int n,i;
printf("请输入插入节点的个数n: ");
scanf("%d",&n);
getchar();
for(i=n;i>0;i--)
{
p=(linklist )malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next ;
L->next =p;
}
}
//遍历输出并输出长度
status Visit_linklist(linklist &L)
{
linklist p;
int i=1;
p=L->next ;
if(L->next==NULL)
return ERROR;
while(p->next !=NULL)
{
printf("%d ",p->data );
p=p->next ;
i++;
}
printf("%dn",p->data );
printf("长度为:%dn",i);
return OK;
}
//查找值为x的直接前驱结点q并输出
void Search_linklist(linklist &L)
{
int x,k=0;
linklist p=L,q;
printf("输入x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
printf("该表为空 !n");
while(p->next!=NULL)
{
q=p;
if(p->next ->data ==x)
{
printf("%d ",q->data );
k=1;
}
p=p->next ;
}
if(p->next &&p->data ==x)
{
printf("%d ",p->data );
k=1;
}
if(k==0)
printf("未找到值为%d的结点n",&x);
printf("n");
}
//删除节点
status Delete_linklist(linklist &L)
{
linklist p,q;
int k=0,x;
printf("请输入删除节点的值x: ");
scanf("%d",&x);
getchar();
if(L->next ==NULL)
return ERROR;
p=L;
q=L->next ;
while(q!=NULL)
if(q->data ==x)
{
k=1;
p=q ;
p->next =q->next ;
free(q);
q=p->next ;
}
else
{
p=q ;
q=p->next ;
}
if(k==0)
printf("表中没有值为%d的结点!n",&x);
return OK;
}

//链表逆置
void ListInverse_linkliast(linklist &L)
{
linklist k,p,q;
p=L;
while (p->next !=NULL)
{
p=p->next ;
}
k=p;
while (L->next !=p)
{
q=L->next ;
L->next = q->next ;
k->next =q;
}
}
//链表奇偶分解
void Break_linklist (linklist &La,linklist &Lb)
{
linklist p,q;
p=La->next;
q=Lb;
while(p->next!=NULL)
{
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
p=p->next ;
}
if(p->data %2==0)
{
q->next =p;
q=q->next ;
}
}

//主菜单
void main()
{
linklist L1,L2;
printf(" (1) 建立带头节点的单链表n");
printf(" (2) 插入节点n");
printf(" (3) 计算链表长度并输出单链表n");
printf(" (4) 查找值为x的直接前驱结点并输出其值n");
printf(" (5) 删除节点值为x的结点n");
printf(" (6) 逆置单链表结点n");
printf(" (7) 单链表奇偶分解n");
int choice;
printf(" 请输入选择:");
while(scanf("%d",&choice))
{
getchar();
printf("nn");
switch(choice)
{
case 1:
Create_Linklist(L1);
break;
case 2:
Insert_Linklist(L1);
break;
case 3:
Visit_linklist(L1);
break;
case 4:
Search_linklist(L1);
break;
case 5:
Delete_linklist(L1);
break;
case 6:
ListInverse_linkliast(L1);
break;
case 7:
Create_Linklist(L2);
Break_linklist (L1,L2);
break;
default:
printf(" 输入有误!");
break;
}
}
}
已知指针ha和hb分别指向两个单链表的头结点,编写一个算法,将ha和hb连接在一起,即令其中一个表的首结点
已知指针ha和hb分别指向两个单链表的头结点,编写一个算法,将ha和hb连接在一起,即令其中一个表的首结点
即令其中一个表的首结点连接在另一个表的最后一个结点之后,hc指向连接后的单链表.………………
古埃及人1年前3
蒋泽宇 共回答了12个问题 | 采纳率75%
这个问题.
typedef struct node
{
ElemType data;
struct node * next;
}linknode,*linklist;
void concat(linklist &hc,linklist ha,linklist hb)
{//hb表的首结点连接在ha表的最后一个结点之后,hc指向连接后的单链表.
linknode *p;
hc=ha;
p=ha;
while(p->next!=NULL)
{
p=p->next;
}
p->next=hb->next;
}
已知单链表L中的结点是按值非递减有序排列的,试写一算法将值为X的结点插入表L中,使得L仍然有序
已知单链表L中的结点是按值非递减有序排列的,试写一算法将值为X的结点插入表L中,使得L仍然有序
写出算法
mbf1111年前1
fayewan 共回答了22个问题 | 采纳率90.9%
s表示要插入的节点,假设s已被赋值.
L表示目的链表,且L.head仅为头指针,不存储信息
Node* q = L.head
Node* p = L.head->next
while( p != NULL ) {
if( s->value value ) // 找到了s该插入的位置,并且此时p,q已记录下要插入的位置
break
else
q = p
p = p->next
}
// 将s节点插入到q,p节点之间
s->next = p;
q->next = s;
画画图就出来了,不过不要漏考虑插入位置在表头或表尾的情况
3.在单链表指针为p的结点之后插入指针为s的结点,正确的操作哪个
3.在单链表指针为p的结点之后插入指针为s的结点,正确的操作哪个
3.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是 .
A.p->next=s;s->next=p->next B. s->next=p->next ;p->next=s;
C.p->next=s;p->next=s->next D.p->next=s->next;p->next=s
幸福的闫1年前1
飘泊秦人 共回答了17个问题 | 采纳率100%
选B
s->next=p->next; //先让s->next指向p->next
p->next=s;//然后再将s设置为p的后继结点
若先做p->next=s,那么p原来的后继结点就没办法找到了,链表被断开
设a和b是两个单链表,表中元素递减有序。试编写一个算法,将a和b归并成一个按元素值递增有序的单链表c,并要求辅助空间为O
设a和b是两个单链表,表中元素递减有序。试编写一个算法,将a和b归并成一个按元素值递增有序的单链表c,并要求辅助空间为O(1),c表的头结点可另辟空间。请分析算法的时间复杂度。,
九尾狐61年前1
wzy_eagle 共回答了21个问题 | 采纳率85.7%
node *mergelink(node *p, node *q)
{
node *h, *r;
h = (node*) malloc (sizeof(node));
h->next = NULL;
r = h;
while (p != NULL && q != NULL)
{
if (p->data <= q->data)
{
r->next = p;
r = p;
p = p->next;
}
else
{
r->next = q;
r = q;
q = q->next;
}
}

if (p == NULL)
r->next = q;
if (q == NULL)
r->next = p;

p = h->next;
h = h->next;
free(p);
return h;
}
一个完整的程序,用前插法和后插法创建一个单链表,注释每行都要有
一个完整的程序,用前插法和后插法创建一个单链表,注释每行都要有
将一组数字,如2,7,9,3,6,5按从小到大的顺序排列,注释尽量说的通俗易懂
mmmm20061年前1
莫非RPG 共回答了13个问题 | 采纳率100%
/*------------------------------------------------------------
* 使用C++完成前插和后插创建链表,如果您是要使用C的话,只需要
* 简单做一些改动即可,程序在VS2005中调试通过
*------------------------------------------------------------*/
#include
using namespace std;
//链表的节点的结构体
struct Node
{
int data; //数据域
Node *next;//指针域
};
typedef Node LinkList;
//前插法创建链表
LinkList *CreateFront(int num)//参数num是创建链表的节点个数
{
//
LinkList *head = NULL; //链表表头
int x;
for(int i=0; inext;//将指针后移,为了插入下一个节点做准备
}
}
return head;
}
//此函数是用于打印结果的
void Display(LinkList *head)
{
LinkList *p = head;//指向链表表头
while(p != NULL)//若指针不空,则打印出节点的数据,一直到打印玩整个链表
{
cout
已知无头单链表A和B表示两个集合,用算法实现A=A-B补集
已知无头单链表A和B表示两个集合,用算法实现A=A-B补集
数据结构
jianghuiyili1年前1
69128431 共回答了11个问题 | 采纳率90.9%
data_int
#include "head.h"
struct LNode{
// char data[10];
int data;
struct LNode *next;
};
typedef struct LNode * LinkList;
void InitList_L(LinkList &L)//链表构造函数
{
L=new LNode;
L->next=NULL;
}
void PrintList_L(LinkList &H)//链表显示函数
{
LinkList L=H;
L=L->next;
while(1)
{
cout<<"data value is "<data< L=L->next;
if (L==NULL)
return;
}
}
void Insert_L(LinkList &H,int n=0)//插入链表
{
LinkList L=H;
LinkList p=L;
int i=0;
if (n==0)
{
n=1;
while(p->next!=NULL)
{
p=p->next;
n++;
}

}
else if (n<1)
{
cout<<"error"< return;
}
for (i=0;i {
if (L->next==NULL)
{
cout<<"error"< return;
}
L=L->next;
}
p=new LNode;
cout<<"please input a value:";
cin>>p->data;
p->next=L->next;
L->next=p;
}
LinkList bing_LinkList(LinkList a,LinkList b)
{
LinkList c;
LinkList nc;
LinkList t;
InitList_L(c);
nc=c;
a=a->next;
while (a!=NULL)//复制a到c
{
t=new LNode;
t->data=a->data;
nc->next=t;
t->next=NULL;
nc=nc->next;
a=a->next;
}
b=b->next;
while (b!=NULL)
{
nc=c;
while (nc->next!=NULL)
{
if (nc->next->data==b->data)
break;
nc=nc->next;
}
if (nc->next==NULL)
{
t=new LNode;
t->data=b->data;
nc->next=t;
t->next=NULL;
nc=nc->next;
}
b=b->next;
}
return c;
}
void main()
{
LinkList a,b,c;
int i=0;

InitList_L(a);
cout<<"nI will input date."< for (i=1;i<=3;i++)
Insert_L(a,i);
// PrintList_L(a);
InitList_L(b);
cout<<"nI will input date."< for (i=1;i<=3;i++)
Insert_L(b,i);
// PrintList_L(b);
c=bing_LinkList(a,b);
PrintList_L(c);

}
数据结构题求解?在一个具有 n 个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是 A.O(1) B.O(n
数据结构题求解?
在一个具有 n 个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是

A.O(1) B.O(n) C.O(n2) D.O(nlog2n)
78955661年前1
james-sjw 共回答了12个问题 | 采纳率83.3%
答案选择B,希望可以帮到你。
编写一个C语言程序实现以下这些1.编写程序完成单链表的下列基本操作: (1)初始化单链表La。 (2)在La中插入一个新
编写一个C语言程序实现以下这些
1.编写程序完成单链表的下列基本操作:
(1)初始化单链表La。
(2)在La中插入一个新结点。
(3)删除La中的某一个结点。
(4)在La中查找某结点并返回其位置。
(5)打印输出La中的结点元素值。
2 .构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。
合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后一个结点。依次扫描La和Lb中的元素,比较当前元素的值,将较小者链接到*pc之后,如此重复直到La或Lb结束为止,再将另一个链表余下的内容链接到pc所指的结点之后。
3.构造一个单链表L,其头结点指针为head,编写程序实现将L逆置。(即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,如此等等。)
华恒1年前1
nowind_0401 共回答了18个问题 | 采纳率94.4%
你这是数据结构的实验?邮箱给我 我可以给你发一份 望采纳
数据结构 算法(求高手解答)有一个由自然数构成的序列采用单链表存储,试编写算法判断该序列是否是fibonacci序列(f
数据结构 算法(求高手解答)
有一个由自然数构成的序列采用单链表存储,试编写算法判断该序列是否是fibonacci序列(fibonacci序列是1,1,2,3,5,8,13,21,34,…).
树树的秘密1年前1
zghqfh 共回答了20个问题 | 采纳率75%
用C语言给你写了一个,其他语言的话再说,算法思想基本就是从表头开始遍历,按照fibonacci的特性进行检验
按单链表的特点,节点命名为node,
一个节点有long int型的data和节点指针型的next两个属性,以下是判断方法
bool Check(node head)
{
//a为当前遍历的节点,b为a之后的节点
node *a, *b;
bool isFibonacci;
//初始化
a = head;
b = head -> next;
//验证最初的两个数
if(!(a->data == 1) && (b->data == 1))
isFibonacci = false;
else
{
isFibonacci = true;
//根据特性,遍历检查
while(b->next != NULL)
{
if((b->next->data) == a->data + b->data)
{
a = b;
b = b->next;
}
else
{
isFibonacci = false;
break;
}
}
}
return isFibonacci;
}
设单链表L带头结点且非空,指针变量p指向L中的一个结点,且该结点既不是L中的第一个结点,也不是L中的最后一个结点,指针变
设单链表L带头结点且非空,指针变量p指向L中的一个结点,且该结点既不是L中的第一个结点,也不是L中的最后一个结点,指针变量s指向一个待插入L的新结点.试写出能完成下列操作的语句序列
⑴在p所指结点之前插入s所指结点;
⑵在L中最后一个结点之后插入s所指结点;
⑶删除p所指结点的直接后继;
⑷删除L中第一个结点.
zknyzkny1年前1
hunter129 共回答了20个问题 | 采纳率85%
1. tmp = L;
while(tmp->next !=p) tmp=tmp->next;
tmp->next = s;
s->next = p;
2. tmp = L;
while(tmp->next != null ) tmp=tmp->next;
tmp->next =s;
s->next =null;
3. tmp = p->next;
p->next = tmp->next;
4. tmp = L->next;
L->next = tmp->next;
已知带表头结点的非空单链表L,指针P指向L链表中的一个结点(非首尾结点),试从下列选项中选择合适的语句序列
已知带表头结点的非空单链表L,指针P指向L链表中的一个结点(非首尾结点),试从下列选项中选择合适的语句序列
1,删除P节点的直接后继结点的语句是()
2.删除P节点的直接前驱结点的语句是()
3.删除P节点的语句序列是()
4.删除首节点的是()
5.删除尾节点的语句是()
a.P=p_>next;
b.p_>next=p
c.p_>next=p_>next_>next;
d.p=p_>next_>next;
e.while(p!=null) p=p_>next;
f.while(Q_>next!=NULL) {P=Q;Q=Q_>next;}
g.while(p_>next!=Q) P=P_>next;
h.while(p_>next_>next!=Q) p=p_>next;
i.while(p_>next_>next!=NULL) p=p_>next;
J.Q=P;
K.Q=P_>next;
l.p=L;
m.L=L_>next;
n.free(Q);
hotstar20081年前1
夜里来 共回答了20个问题 | 采纳率90%
1、k ->c->n
2、j->l->h->k->c->n
3、j->l->g->c->n
4、l->j->m->n
5、l->j->f->"p->next = NULL"->n //删除尾节点需要有个->next = NULL 的赋值吧,选项没有
在一个单链表中,若p所指结点不是最后结点,s指向已生成新结点,则在p之后插入s所指结点的正确操作是?
伊苏卖报子1年前1
bfgh723 共回答了13个问题 | 采纳率92.3%
s->next=p->next;
p->next=s;
已知单链表头指针位置,已知P指针指向其中某结点,设计算法,删除P指针所指向结点
已知单链表头指针位置,已知P指针指向其中某结点,设计算法,删除P指针所指向结点
前驱结点
tonyjh1年前1
tsuncare 共回答了16个问题 | 采纳率93.8%
假设链表类型为
struct node
{
int data;
struct node *next;
};
node *q = p->next;
p->data = q->data;
p->next = q->next;
free(q);
搞定!
思路是这样的:
我们删除p的下一个节点很容易,删除p所指向的节点很难,我们可以用一个巧妙的方法,把p的下一个节点的内容赋值给p(相当于把p删除了,只是下一个节点是一个多余的节点了),那么我们只要删除下一个节点就可以了,这样就转化成删除p的下一个节点了.
最终的到的链是一样的,只是换个思路想问题.
在一个单链表中,若要在p所指向的节点之前插入一个新节点,则此算法的时间复杂性的量级为(A)
在一个单链表中,若要在p所指向的节点之前插入一个新节点,则此算法的时间复杂性的量级为(A)
A O(n) B O(n/2) C O(1) D(√n)
偶尔占线1年前1
萧萧心形 共回答了21个问题 | 采纳率95.2%
在算法的复杂性表示中,O记号表示复杂度的上限.
即:O(g(n)) = {f(n):存在正常数c和n0,使对所有的n>= n0,有0
求单链表中倒数第k个元素 条件:1.建立一个单链表 2.不能利用链表中的元素个数 3.k由键盘输入
求单链表中倒数第k个元素 条件:1.建立一个单链表 2.不能利用链表中的元素个数 3.k由键盘输入
求单链表中倒数第k个元素
条件:1.建立一个单链表 2.不能利用链表中的元素个数 3.k由键盘输入
用算法描述,
shi0005191年前1
ysdboco 共回答了18个问题 | 采纳率66.7%
未知长度单链表求倒数第K个元素解法:
1.指针a从链表头结点移动k个位置
2.指针b从头结点开始移动,同时指针a从第k个位置开始移动,当a到达链表尾部时,指针b到达倒数第k个元素位置.
设链表长度为n,a从k到尾部移动了n-k,所以b也移动了n-k,所以b的位置是倒数n-(n-k)=k

大家在问