帮忙做道C语言的题:双向链表的排序

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

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

#include
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();
}

#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语言基础选择题
1,A 2,b 3,b 4,b 5,a 6,b 7,d 8,d 9,c 10,d 11,a 12,a 13,c 14,d 15,b 16,b我是学计算机的,这些都很基础,所以基本上不会错的,有不明白的,可以留言!

帮忙做道C语言题,加急,谢!
D. *p与s[0]相等

c语言考试题目,一共20道,不难,求解答。
第4题:C 第5题:A\/\/实际上a、b无声明,编译都过不了 第6题:\/\/p=str错误,编译都过不了 第7题:B 第8题:\/\/p=a错误,过不了编译 第9题:\/\/y=x3\/2错误,过不了编译 第10题:D 第11题:16 第12题:5 第13题:9 第14题:4 3 1 第15题:<><> 第16题:6 5 6 5 3 ...

c语言问题,帮个忙,新手
NN代替N*N\/2 我们把N*N\/2还原:M+1*M+1\/2 3+1*3+1\/2 = 3+3+0=6(1\/2=0应该不难理解吧)同理,5*NN=5*3+1*3+1\/2=18 这也是,为什么强调在宏定义的时候,单个变量也要用括号括起来的缘由。额。。。网页打开,上个厕所回来,答案提交就发现已经有俩在先了。我算路过了吧.....

帮忙做这道判断C语言数据类型的题
上机跑跑,就知道那些是合法的 1524; 十进制整数 0398;错误,八进制不能出现大于8的数 -5.0; 浮点数 241; 十进制整数 2.876; 浮点数 043.2;浮点数 7f; 错误,整型数后面不可以跟f充当浮点数 4.3E10;浮点数 0xff;十六进制整型 e-12;错误,指数前必须要有数 8L;十进制整型 0x8.d7;错误 ...

高人帮帮忙,做几道C语言的习题!!!
13:判断char型变量ch是否为大写字母的正确表达式是( 3).14:以下不正确的C语言标识符是(4)。15:若要利用下面的程序片段使指针变量p指向一个存储整型变量的存储单元,则[ ]中应填入的内容是(4)。16:以下可作为函数fopen中第一个参数的正确格式是(4)。17:一个c程序的执行是从(1).18:...

c语言问题,请高手帮一下忙,谢了! 1、\\ddd有什么意义 2、65是不是字符...
2. 65是个数,一般认为是十进制,若你把它赋给一个字符型变量,如 char a=65;则此时字符型变量“a”就代表字符'A'(ASCII码对应过来的)3. 八进制转换为十进制:如上面提到的“\\101”中的八进制数101,转换为十进制就是:1*(8^2)+0*(8^1)+1*(8^0)=65 即“百位”数字乘以8...

帮下忙~~~非常简单的C语言题
int main(){ int x,y,z,max;scanf("%d %d %d",&x,&y,&z);max = x;if(max < y) max = y;if(max < z) max = z;printf("最大数为:%d\\n",max);return 0;} 3 include<stdio.h> int main(){ double x,y;scanf("%lf",&x);if(x < 1) y = x;else if(x < 10...

4道C语言的基础题目,麻烦各位知友帮个忙,刚开始学C
一、printf("%c",*a[i]);表示输出地址a[i]所在的字符,如果你想输出字符串,就必须改成printf("%s",a[i]);或者是puts(a[i]);二、你的代码中指针p是指向a[4]的地址,而输出语句中,是输出指针p的数据,所以输出的是a[4]以后的数据,也就是456789。如果你想输出0~9,那么就要把指针p...

10道经典的C语言例题(含参考程序)
int main(){ int bai_wei,shi_wei,ge_wei,i,sum=0;for(i=100;i<1000;i++){ bai_wei=i\/100;shi_wei=(i%100)\/10;ge_wei=i%10;if(i==pow(bai_wei,3)+pow(shi_wei,3)+pow(ge_wei,3)){ printf("%d ",i);sum++;if(sum%5==0)printf(" ");} } printf(" ");return ...

册亨县13247174849: 帮忙用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("请输入...

册亨县13247174849: 求高手做个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,...

册亨县13247174849: 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("不能分配内存空间!");...

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

册亨县13247174849: 用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;}// 冒泡排序对链表进行排序...

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

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

册亨县13247174849: 求一个双向循环链表排序的代码谢谢 -
包尚美乐: #include <stdio.h>#include <string.h> typedef struct Node { int num; struct Node *pre; struct Node *next; }My_Node;// head为双向链表表头// dir为排序方向:0为升序,1为降序 void sort_list(My_Node *head, int dir) { if(head == NULL) return ; My_...

册亨县13247174849: C语言链表排序 -
包尚美乐: 请看ListSort3(L); 程序初始顺序是:6 3 67 2 15 13 10 6 4 排好序的顺序是:3 2 4 6 6 67 15 13 10#include #include#include/************************************************************************/ /* 常量定义 */ /***********************************************...

册亨县13247174849: 急要!!c 语言的题目,^^链表^^排序
包尚美乐: void func(Struct *p) { struct *p1; for(;p->next!=null;p=p->next;) { for(p1=p->next;p1!=null;p1=p1->next) { struct *temp=p; if(p->num>p1->num) { p=p1; p1=temp; } } } }

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