用c语言编程,关于链表的

问题描述

用c语言编程,关于链表的

请教各位大神:实现创建链表,输出链表两个函数怎么编程序。。。
输入两个非降序列,转换成两个非升序列,合并成一个非升序列,用链表实现

解决方案

C语言编程入门——链表

解决方案二:

您这问题也太多了吧。创建链表都要问,创建链表书上都有。第一行的问题自己想办法。
第二行问题我回答下,可以想象一下当一个链表从非降序转化成非升序时,其实就是将链表逆序。可以新建一个链表,然后遍历要逆序的链表,每次将每个元
素插入到新链表的第一个位置。这样遍历结束后新链表就是非升序的。
两个非降序列,转换成两个非升序列,合并成一个非升序列。其实道理是一样的,多了比较而已,
第一步 新建一个新的链表
第二步 定义三个指着分别指向非降序链表(p1,p2),和新生成的链表(p3)
第三歩 比较比较p1和p2所指的元素大小,哪个元素大就讲哪个元素插入到新链表中的第一的位置上,并将该指着移动到下一个位置上。
重复做第三步,知道摸一个非降序链表遍历结束,将另一个还剩下的元素遍历每个元素还是直接插入到新链表的首部。

解决方案三:

参考:http://blog.csdn.net/pf4919501/article/details/38818335
建议楼主先自己试着写一下,有问题的话可以再发上来

解决方案四:

链表的创建。。。。。。。。。还是看书吧。先把链表的定义搞清楚.楼上回答的已经很清楚了。这里我补充一下代码,哈哈。
两个非降序列,转换成两个非升序列:就是先分别反转链表。反转链表代码如下
ListNode* reverseList(ListNode* head) {
if(NULL==head)
{
return head;
}
ListNode* prev=head;
ListNode* cur=head->next;
ListNode* tmp=NULL;
prev->next=NULL;
while(cur!=NULL)
{
tmp=cur->next;
cur->next=prev;
prev=cur;
cur=tmp;
}
return prev;
}
大意就是设两个指针,两个指针指向相邻的结点。然后反转相邻的两个结点,然后指针向前走,再反转指向的两个结点。不断重复,一直到链表结尾。就可以了。
除了这种方法以外,还可以用递归。代码如下:
ListNode* reverseList(ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
ListNode* tmp;
tmp=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return tmp;
}
反转完链表以后。接下来就是将两个链表merge成一下单链表。楼上说的很清楚,但是需要额外申请空间。这里有一个方法不用申请内存。如下:
ListNode* reverseList(ListNode* head) {
if(head==NULL||head->next==NULL)
{
return head;
}
ListNode* tmp;
tmp=reverseList(head->next);
head->next->next=head;
head->next=NULL;
return tmp;
}
依然是递归。如果不懂递归。。。。。。。。看书去。

解决方案五:

上面的merge链表函数写错了。更正如下(并补充非递归的写法)
递归:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL) return l2;
if(l2==NULL) return l1;
ListNode* Head=NULL;
if(l1->valval)
{
Head=l1;
Head->next=mergeTwoLists(l1->next,l2);
}
else
{
Head=l2;
Head->next=mergeTwoLists(l1,l2->next);
}
return Head;
}
非递归:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==NULL&&l2==NULL) return NULL;
vector NodeVec;
while(l1!=NULL&&l2!=NULL)
{
if(l1->val>l2->val)
{
NodeVec.push_back(l2);
l2=l2->next;
}
else
{
NodeVec.push_back(l1);
l1=l1->next;
}
}
while(l1!=NULL)
{
NodeVec.push_back(l1);
l1=l1->next;
}
while(l2!=NULL)
{
NodeVec.push_back(l2);
l2=l2->next;
}
int i=0;
for(;i
{
NodeVec[i]->next=NodeVec[i+1];
}
NodeVec[i]->next=NULL;
return NodeVec[0];
}

时间: 2024-09-20 15:58:47

用c语言编程,关于链表的的相关文章

编程c语言-顺序链表的插入用C语言编程实现

问题描述 顺序链表的插入用C语言编程实现 题目是:向递增的顺序链表中插入一个数,将插入后的链表输出.下面是源程序,但只能输入,但一输出就崩溃是咋回事啊?哪位大神求解,,,感激不尽... #include #include typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; LinkList CreateListR(LinkList L) { int n; LinkList p,s; p=L=(LinkLis

c语言问题-顺序链表的插入用C语言编程实现

问题描述 顺序链表的插入用C语言编程实现 将一个整数插入到有序的顺序链表中,以下是我的源程序,请问哪错了啊?? #include #include typedef struct Lnode { int data; struct Lnode *next; }Lnode,*LinkList; LinkList CreateListR(LinkList L) { int n; LinkList p,s; p=L=(LinkList)malloc(sizeof(Lnode)); scanf("%d&qu

c语言-C语言编程,约瑟夫环问题,用链表实现

问题描述 C语言编程,约瑟夫环问题,用链表实现 #include struct num { int n; struct num *p; } a[14]; int main() { struct num *pt; int i; for(i=0;i<14;i++) a.n=i; for(i=1;i<14;i++) a.p=&a[i+1]; a[13].p=&a[1]; pt=&a[1]; for(i=0;i<14;i++) printf("%5d"

c语言-M只猴子选大王的另一种问法,怎样用C语言编程解决啊,急求

问题描述 M只猴子选大王的另一种问法,怎样用C语言编程解决啊,急求 M只猴子选大王,选举办法如下:所有猴子按1...M编号围坐一圈,从第1号开始按顺序1,2...N报数,报到N的猴子退出到圈外,再从下一个猴子开始继续1,2...N报数,报到N的猴子退出圈外,如此循环,直至圈内只剩下一只猴子时就说大王,给定M和最后出圈的者的编号S,求最小的N 解决方案 约瑟夫环问题 解决方案二: 来自百度: #include #include #define n 19 #define m 4 typedef st

浅谈C语言编程中程序的一些基本的编写优化技巧_C 语言

大概所有学习C语言的初学者,都被前辈说过,C语言是世界上接近最速的编程语言,当然这并不是吹牛,也并不是贬低其他语言,诚然非C语言能写出高速度的代码,但是C语言更容易写出高速的程序(高速不代表高效),然而再好的工具,在外行人手中也只能是黯淡没落. 对于现代编译器,现代CPU而言,我们要尽量迎合CPU的设计(比如架构和处理指令的方式等),虽然编译器是为程序员服务,并且在尽它最大的能力来优化程序员写出的代码,但是毕竟它还没有脱离电子的范畴,如果我们的代码不能让编译器理解,编译器无法帮我们优化代码,那么

c语言编程-请大神用c语言来编程,不是c++

问题描述 请大神用c语言来编程,不是c++ (请大神用c语言编程,不是c++.完成加微信重酬)看病要排队这个是地球人都知道的常识. 不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能根据简单的先来先服务的原则.所以医院对每种病情规定了10种不同的优先级.级别为10的优先权最高,级别为1的优先权最低.医生在看病时,则会在他的队伍里面选择一个优先权最高的人进行诊治.如果遇到两个优先权一样的病人的话,则选择最

求助贴:c语言编程问题

问题描述 求助贴:c语言编程问题 解决方案 在你的程序里scanf()函数返回的是一个正整数,无论你输入的是不是-1,他接收的一直是一个参数,所以返回的一直是1.并且还是使用"%lu"来接收参数的,输入-1一定不会退出程序的,输入1.2scanf()只接收到了1,因为1.2不符合输入的规则"%lu",也会返回1.程序不会停下 解决方案二: 疑惑:1.输入0有效,输出真确2.输入-1不退出,-1被强制转换为int类型3.输入1.2输出1个奇数后又printf();然后

c语言-两道C语言编程题:求教各位大神

问题描述 两道C语言编程题:求教各位大神 两元一瓶啤酒,两个啤酒瓶换一瓶啤酒,四个啤酒瓶盖换一瓶啤酒,输入的金额可以买几瓶. 输入一串字符串,写两个函数,第一个函数使输入的字符串全都后移一位,第二个函数将字符串中的字母大写换小写,小写换大写?. 拜托各位了 谢谢~ 解决方案 第一个问题描述不清,不知道是不是可以借啤酒瓶和瓶盖,我的程序按照不可以编写: #include <stdio.h>int foo(int money){ int c = money / 2; int c1 = 0; int

c语言编程报错,简单程序

问题描述 c语言编程报错,简单程序 题目是输出a,b.c中最小数值 自学c语言,求帮忙看看哪里不对呀 #include #include int min(int a,int b,int c ) { int z; if(a<b) z=a; { if(a<c) z=a; else z=c; return (z); } else z=b; { if(b<c) z=b; else z=c; return(z); } } main () { int x,y,m; printf("Inpu