跪求C语言建立双向链表递归快速排序的完整程序

作者&投稿:诗瑾 (若有异议请与网页底部的电邮联系)
求用C语言编译双向链表排序~

这是链表的基本应用程序,自已动手练习一下吧,可以体会链表的结构组织与应用,读别人的代码会很累的,不如自己实现自己的。 你若是写了代码我可以帮你调试。你若是求完成作业,那等等吧

无人

http://zhidao.baidu.com/question/65669305.html

#include <stdio.h>
typedef struct Link/*双向链表结构体*/
{
int data;
struct Link *lift;
struct Link *right;
}linkx,*linky;
linky Init();/*建立双向链表*/
void PrLink(linky p);/*输出双向链表*/
linky Sort(linky head);/*对双向链表排序*/
linky Swap(linky head,linky one,linky two);/*任意交换双向链表两个结点的地址*/
void main(void)
{
linky head;
head=Init();
head=Sort(head);
PrLink(head);
}
linky Init()/*建立链表*/
{
linky p,q,head;
int n=0;
head=p=q=(linky)malloc(sizeof(linkx));
clrscr();
printf("please input 10 num: ");
scanf("%d",&p->data);/*输入数据*/
head->lift=NULL;
n++;
while(n!=10)/*一直输入到规定的数字个数停止*/
{
q=p;
p=(linky)malloc(sizeof(linkx));
scanf("%d",&p->data);/*输入数据*/
q->right=p;
p->lift=q;
n++;
}
p->right=NULL;
return(head);
}
linky Swap(linky head,linky one,linky two)/*任意交换两个结点*/
{linky temp;
if(one->lift==NULL&&two->right==NULL)/*首和尾巴的交换*/
{
if(one->right==two)/*只有两个结点的情况下*/
{
two->right=one;
two->lift=NULL;
one->lift=two;
one->right=NULL;
head=two;
}
else/*有间隔的首尾交换*/
{
one->right->lift=two;
two->lift->right=one;
two->right=one->right;
one->lift=two->lift;
two->lift=one->right=NULL;
head=two;/*尾结点成为头结点*/
}
}
else if(two->right==NULL)/*尾和任意一个交换*/
{
if(one->right==two)/*交换最后两个结点*/
{
one->lift->right=two;
two->lift=one->lift;
two->right=one;
one->lift=two;
one->right=NULL;
}
else/*和前面其他结点交换*/
{
temp=two->lift;
temp->right=one;
one->lift->right=two;
one->right->lift=two;
two->lift=one->lift;
two->right=one->right;
one->lift=temp;
one->right=NULL;
}
}
else if(one->lift==NULL)/*头和任意一个交换*/
{
if(one->right==two)/*交换头两个结点*/
{
two->right->lift=one;
one->right=two->right;
one->lift=two;
two->right=one;
two->lift=NULL;
head=two;
}
else/*头结点和后面其他结点交换*/
{
temp=one->right;
temp->lift=two;
one->lift=two->lift;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=NULL;
head=two;/*交换的结点成为头结点*/
}
}
else/*当中的任意两个交换*/
{
if(one->right==two)/*交换连在一起的两个结点*/
{
temp=one->lift;
one->lift->right=two;
one->right->lift=two;
one->lift=two;
one->right=two->right;
two->right->lift=one;
two->right=one;
two->lift=temp;
}
else/*交换隔开的两个结点*/
{
one->lift->right=two;
one->right->lift=two;
one->lift=two->lift;
temp=one->right;
one->right=two->right;
two->lift->right=one;
two->right->lift=one;
two->right=temp;
two->lift=one->lift;
}
}
return(head);
}
linky Sort(linky head)/*对链表排序*/
{
linky i,j,t,p;
int max;
p=head;
for(i=p;i->right!=NULL;i=i->right)/*用选择法的思想对这些结点排序*/
{
max=i->data;
for(j=i->right;j!=NULL;j=j->right)
if(j->data<max)
{
max=j->data;
t=j;
}
if(max!=i->data)/*如果没有找到比i小的结点*/
{
head=Swap(head,i,t);/*因为最终返回的是头结点,而头结点又有可能变化,所以每次头结点返回*/
i=t;
}
}
return(head);
}
void PrLink(linky p)/*输出链表*/
{
linky q;
printf("Now the link: ");
do
{
q=p;
printf("%d ",p->data);
p=p->right;
free(q);/*释放输出结点*/
}
while(p!=NULL);
getch();
}


两道C语言编程题
include <stdio.h> int main(){ FILE *p1,*p2;char name1[40],name2[40];printf("Enter the name of the input file: ");scanf("%s",name1);p1=fopen(name1,"r");if(p1==0){ printf("Cannot open the file.\\n");return 1;} printf("Enter the name of the output file: "...

一口气玩转链表(C语言版)
循环链表和双向循环链表通过首尾连接,链表可以变为循环链表,支持双向循环链表则同时支持正向和反向遍历。这些高级结构的创建和使用示例也在文中提供。结论本文详细介绍了链表的基本概念、创建过程以及各种操作,包括静态链表、双向链表和循环链表。这些内容都包含在一套通俗易懂的C语言教程中,适合有一定C语言...

一道链表c语言题,求救!!!
链表节点就是一个值加指向下一个值的指针构成的(双向链表多一个指向上一节点的指针)。完整的程序如下(可以正确输出1342)include<stdio.h> define N 4 struct node { int x;struct node *next;};void print(struct node *p){ while(p != 0){ printf("%4d", p->x);p = p->next;}...

麻烦讲解一下C语言中的链表
双向链表和单链表类似,就是多了一个指向区,指向当前节点的上一个节点,好处是,因为单链表只能顺序向下读取,而不能你想读取,双项链就可以任意方向读取数据了。一般链表在应用时,会额外建立一个链表头。在链表头里会有一些方便对链表操作的东西。比如你说的free指针,链表的第一节点地址,链表的尾...

双向链表中连续两个节点p,q之间 插入一个s
p->next = s;s->next = q;s->front = p;q->front = s;如果不明白,再HI我吧

已知一双向循环链表,从第二个节点至表尾递增有序(设a1<x<an)。_百度...
L;InitList_DUL(L);\/\/定义CreateList_DUL(L);\/\/初始化、创建双向循环链表L;resetting(L);\/\/引用重构函数;display(L);\/\/最后输出结果;}最后结果就是这样:=-=想必是在学数据结构,我还是大一学的C语言,快两年没动了,写起来忒费劲了 很多细节地方我也不太懂,但最后能运行起来就是了== ...

写一个读入一个字符串,把它顺序存入一个双向链表,并按逆序输出的程序...
include "stdio.h"struct node { struct node *front;char c;struct node *next;};struct node *input(struct node *top);int main(void){ struct node T,*top=&T,*tail=&T,*p=NULL;T.front=NULL;T.next=NULL;T.c='\\0';tail=input(top);p=tail->front;while(p!=NULL){ printf(...

双向循环链表是什么?
一个指向其直接后继的指针域ne*t。这样形成的链表中有两个方向不同的链,故称为双向链表。2.双向循环链表将双向链表的头结点和尾结点链接起来也能构成循环链表,其称为双向循环链表。2.双向链表C语言实现的类型定义4.双向链表示意图双向链表示意,如图1所示。图1双向链表示意 ...

C语言。。。
选C,假想为大家手拉手围一个圈

求问c语言单向链表和双向链表与循环链表的区别
循环单向链表是这样的:若干个人围成一圈,每个人都抬起右手指向他右边的人,这样每个人的右手都能指到一个人(如果只有一个人,那么他的右手指向自己)。从任意一个人开始,沿着手指的方向,可以不停地循环找到每一个人。非循环的双向链表是这样的:若干个人排成一排,每个人都抬起左手指向他左边的人...

怀仁县17394441337: 帮忙用c语言设计一个双向链表的排序 -
上林倍舒: #include <malloc.h> #include <stdio.h> struct Node { int data; struct Node* next; struct Node* prev; }; struct Node* create_list(int N) { struct Node *head = NULL; struct Node *p = NULL, *q = NULL; int i = 0, data = 0; for (i = 0; i < N; i++) { printf("请输入...

怀仁县17394441337: 求高手做个c语言设计一个双向链表的排序 -
上林倍舒: #include <stdio.h> typedef struct Link/*双向链表结构体*/ { int data; struct Link *lift; struct Link *right; }linkx,*linky; linky Init();/*建立双向链表*/ void PrLink(linky p);/*输出双向链表*/ linky Sort(linky head);/*对双向链表排序*/ linky Swap(linky head,...

怀仁县17394441337: C语言双向链的排序 -
上林倍舒: 链表结构定义 typedef struct node { char data[19+1]; struct node *llink; struct node *rlink;/*上一个,下一个*/ }; /*创建链表*/ int creat_list(struct node *h) { /* if((h=(struct node *)malloc(sizeof(struct node)))==NULL) { printf("不能分配内存空间!");...

怀仁县17394441337: C语言 双向链表 快速排序
上林倍舒: 我说一下想法你看行不行 直接在链表中排序太麻烦,不如把关键字和指针单独抽取出来放到一个结构体数组中 然后对这个数组进行排序,排好后按相应指针顺序输出链表元素即可 在输入规模不大的情况下增加了一些空间代价,但是却可使代码简化不少,应该是可行的. 当然直接交换双向链表中的两个元素也非难事.

怀仁县17394441337: 用c++语言实现双向链表的排序 -
上林倍舒: #include #include struct _Node { int data; struct _Node *next;};typedef struct _Node Node;// 交换两个结点的数据void SwapNodeData(Node *p1, Node *p2) { int temp = p1->data; p1->data = p2->data; p2->data= temp;}// 冒泡排序对链表进行排序...

怀仁县17394441337: C语言双向链表排序 -
上林倍舒: 删除节点就是把某个节点从链表中取出,释放掉内存,把它前后节点再相连; 序号就是节点的位置,比如头结点就是1,头结点的下一个节点就是2以此类推; 数值就是随便一个数,比如每个节点都有一个int类型的变量,按这个变量的值从小到大或从大到小排序;

怀仁县17394441337: c语言递归排序怎么写、????? -
上林倍舒: #include<stdio.h> void main(){ int a,b; printf(“请输入所求阶乘的数a:\n");scanf("%d",&a); fun(&a); printf("所得a的阶乘为:\n”);int fun(int a){ int a; if(a==0) a=1; esle a=fun(n)*fun(n-1); return a; } } 试一下吧,生疏了

怀仁县17394441337: 用c++语言实现双向链表的排序
上林倍舒: #include <stdio.h>#include <stdlib.h>#include <time.h>struct _Node { int data; struct _Node *next;};typedef struct _Node Node;// 交换两个结点的数据void SwapNodeData(Node *p1, Node *p2) { int temp = p1->data; p1->data = p2->data; p2->data=...

怀仁县17394441337: C语言双向链表 -
上林倍舒: #include "stdio.h" #include "stdlib.h" typedef int ElemType;//元素类型 typedef struct DuLNode {//双向链表 ElemType data; struct DuLNode *prior, *next; }DuLNode,*DuLinkList; int Create(DuLinkList &L) {//建立双向链表 DuLinkList p,q; ...

怀仁县17394441337: C语言链表如何排序
上林倍舒: 可以把链表设计成循环链表,用冒泡排序 在排序前设计一个交换标记,如在循环过程中有交换,则修改这个标记变量,如果在一次循环(当前节点为刚开始时节点,表示循环了一次)中,交换标记没有被修改,则表明该数列已排好序. 现在给...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网