编写c语言程序1. 设A和B是两个非递减的顺序表.编写算法,把A和B中都存在的元素组成新的由大到小的顺序表C.

编写c语言程序1. 设A和B是两个非递减的顺序表.编写算法,把A和B中都存在的元素组成新的由大到小的顺序表C.,第1张

#include "stdafx.h"

#include<iostream>

#include<queue>

using namespace std

 

typedef struct node{

        int data

        struct node *next

}Node,*List

 

List createList(int N,int multi)

{

    List head = (List)malloc(sizeof(Node))

    head->data = 0

    head->next=NULL

    int count = 0

    List p = head

    while(count<N)

    {   count++

        List s = (List)malloc(sizeof(Node))

        s->data = count*multi

        s->next = NULL

        p->next = s

        p = s

    }

    return head

}

 

void traverse(List head)

{

    if(head == NULL)

    {

        return

    }

    List p = head->next

    while(p)

    {

        cout<<p->data<<" "

        p = p->next

    }

    cout<<endl

}

 

List unionList(List list1,List list2)

{

    if(list1 == NULL||list1->next==NULL)

        return list2

    if(list2 == NULL||list1->next==NULL)

        return list1

 

 

    list1 = list1->next

    list2 = list2->next

    List head = (List)malloc(sizeof(Node))

    List p = NULL

     

    if(list1!=NULL && list2!=NULL)//初始化第一个节点

    {

        if(list1->data<=list2->data)

        {

            head->next = list1

            list1 = list1->next

        }else{

            head->next = list2

            list2 = list2->next

        }

    }

    p = head->next

    while(list1!=NULL && list2!=NULL)//主体部分

    {

        if(list1->data<=list2->data)

        {

            p->next = list1

            list1 = list1->next

            p = p->next

      宏手  }else{

            p->next = list2

            list2 = list2->next

            p = p->next

   蔽销嫌     }

    }

    while(list1 != NULL)//如果list2已经完了,list1还有剩余

    {

        p->next = list1

        list1 = list1->next

        p = p->斗枝next

    }

    while(list2 != NULL)//如果list1已经完了,list2还有剩余

    {

        p->next = list2

        list2 = list2->next

        p = p->next

    }

    return head

}

 

int main()

{

    int N = 10

    List head1 = createList(N,1)

    List head2 = createList(N,2)

    traverse(head1)

    traverse(head2)

    List head = unionList(head1,head2)

    traverse(head)

    getchar()

    return 0

}

#include<stdio.h>

#include<stdlib.h>

void displayData(int a[100])

{

int i

for(i=0i<100i++)

{

if(i%5==0){

printf("\n")

}

printf("%4d",a[i])

}

}

//判断数组中元素是否重复,重复返回1,否则返回0

int chongfu(int r[],int n,int data)

{

int i

for(i=0i<ni++)

{

if(r[i]==data)

{

return 1

}

}

return 0

}

//生成随机数的数组

void createRandomArray(int RAN[100])

{

int i,flag=0,random

for(i=0i<100i++)

{

while(1)

{

random=rand()

if(random<1000&&chongfu(RAN,i-1,random)==0)

{

RAN[i]=random

break

}

}

}

displayData(RAN)

}

//插入排序

void insertsort(int r[],int i,int x)

{ /铅桥/i为数组r中已有序的元素的个数

while(i!=0 ){ r[i]=r[i-1]i--}

r[i]=x}

void main()

{

int RAN[100]

createRandomArray(RAN)

printf("\nok,随机数生成,开始执行排序 *** 作 :\n")

printf("槐散猛\n执掘掘行插入排序后:\n")

bubbleSort(RAN)

printf("\n执行选择后:\n")

chageSort(RAN)

printf("\n")

displayData(RAN)

getchar()

}

我帮你看了一下,找出了你错误的地方。

以下是修改后的源代码,修改地方核樱都有注释(vc++ 6.0下编译通过):

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef char datatype

typedef struct node

{

datatype data

struct node *next

} linklist

linklist*createlist()

{

//int num

datatype num/* 类型要保持一致 */

linklist *head,*s,*r

head=(linklist*)malloc(sizeof(linklist))

r=head

printf("请输入非递减链表,以#结束\n")

fflush(stdin)//清空输入缓冲区,避免回车字符被接收

num=getchar()

while(num!='#')

{

s=(linklist*)malloc(sizeof(linklist)) //令s为申请的空间掘悉

s->data=num

r->next=s

r=s

fflush(stdin)//清空输入缓冲区,避免回车字符被接收

num=getchar()

}

r->next=NULL

return head

}

//在带头节点的单链表head中查找第i个节点,若找到,则返回该节点的存储位置;否则返回判氏乎NULL

void putout(linklist *head) //单链表的输出

{

linklist *p

p=head->next

if(p==NULL) printf("链表为空")

else

{

while (p!=NULL)

{

printf("%c",p->data)//先这样写,最后要修改输出之间的间距

p=p->next

}

}

}

//void insert(linklist*head,int num) //插入函数,x为要插入的结点上的数据

void insert(linklist*head,datatype num/* 类型要保持一致 */) //插入函数,x为要插入的结点上的数据

{

linklist *s,*p,*q

s=(linklist*)malloc(sizeof(linklist)) //令s为申请的空间

s->data=num//s的数据是num

p=head->next

q=p->next //一开始p为第一个结点,q为第二个结点 (样本写反了还是?)

while(q!=NULL)

{

if(num<=q->data&&num>=p->data) //题设要求事先输入的是非递减,

{

p->next=s

s->next=q

break

} //找到并插入

else

{

p=q

q=q->next

} //没找到,继续往后移动

}

if(q == NULL)//没找到才执行这里, 不然p->data的值是上面while语句break出来后存的值,再进入这里执行就不对

{

//if(num>=q->data) //比最大的还大,则插入到最后面s->data能否换成num?

if(num>=p->data) //这里要写p->data,因为while语句找不到q已经指向NULL了

{

//q->next=s

p->next=s//这里要写p->data,因为while语句找不到q已经指向NULL了

s->next=NULL

}

if(num<=head->next->data)//比最小的还小,则插入到最前面

{

p=head->next //这一行没看懂有什么意义……待会儿去掉试试

head->next=s

s->next=p

}

}

}

void main()

{

linklist *head

//int num

datatype num/* 类型要保持一致 */

head=createlist()

putout(head)

printf("\n")

printf("请输入一个要插入的元素:")

//scanf("%d",&num)

fflush(stdin)//清空输入缓冲区,避免回车字符被接收

num=getchar()//类型要一致,继续字符形式输入

insert(head,num)//插入

putout(head)//输出

printf("\n")//换行,输出好看一点

}

另外你说打印为啥要%c,因为链表的生成是以字符输入,你%d的话打印的结果是字符的ascii码值。

希望对你有帮助。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12388499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存