您的位置:首页 > 其它

第二章:线性表算法设计题(5-8)

2015-01-05 12:59 246 查看
问题描述:

  (5)将链表A分解为B和C;B为值小于0的,C为值大于0的;

  (6)一遍遍历,寻找单链表中的最大值;

  (7)一遍遍历,将链表的所有连接方向逆转;且利用原表的存储空间;

  (8)删除链表A中大于max,小于min的值;

代码实现:

001
#include <stdio.h>
002
#include <string.h>
003
#define Status in
004
#define ERROR 0
005
#define OK 1
006
//定义的结点类型;
007
typedef
struct
008
{
009
char
name[20];
010
int
number;
011
}Student;
012
typedef
struct
LNode
013
{
014
Student student;
015
LNode *next;
016
}LNode, *LinkList;
017
018
void
CreatList(LinkList L1)
019
{
020
LinkList r=L1;
int
n;
021
//链表的建立,后插法;
022
printf
(
"请输入需要建立的结点数目:\n"
);
scanf
(
"%d"
,&n);
023
for
(
int
i=0;i<n;i++)
024
{
025
int
x;
026
scanf
(
"%d"
,&x);
027
LinkList p =
new
LNode;
028
p->student.number = x;
029
r->next = p; r= p;
030
}
031
r->next = NULL;
032
}
033
034
void
Fen(LinkList L1,LinkList L2,LinkList L3)
035
{
036
//将表A分解为两个表,B表为大于0的元素;C表为小于0的元素;
037
LinkList pa,pb,pc;
038
pa=L1->next;
039
pb=L2;pc=L3;
040
while
(pa)
041
{
042
if
(pa->student.number < 0)
043
{pb->next=pa;pb=pa;}
044
else
045
{pc->next=pa;pc=pa;}
046
pa=pa->next;
047
}
048
pb->next=NULL;pc->next=NULL;
049
//最后需要将L2,L3最后一个结点的next指空;
050
}
051
void
Print(LinkList L)
052
{
053
//输出链表中的值;
054
LinkList p =L->next;
055
while
(p)
056
{
057
printf
(
"%d  "
,p->student.number);
058
p=p->next;
059
}
060
printf
(
"结点输出完毕!\n"
);
061
}
062
void
Xun(LinkList L,Student &student)
063
{
064
//查找链表结点中值最大的;
065
LinkList p=L->next;
066
student.number=p->student.number;
067
while
(p)
068
{
069
if
(p->student.number > student.number)
070
student.number=p->student.number;
071
p=p->next;
072
}
073
printf
(
"查询完毕!\n"
);
074
}
075
076
void
Ni(LinkList L)
077
{
078
//逆序链表的操作;
079
LinkList p=L->next;
080
LinkList prior,r;
081
prior = NULL;
082
while
(p)
083
{
084
r = p->next;
085
p->next=prior;prior=p;
086
p=r;r=r->next;
087
if
(!r)
break
;
088
}
089
p->next=prior;
090
L->next = p;
091
printf
(
"逆序操作完毕!\n"
);
092
}
093
094
void
Shan(LinkList L,
int
max,
int
min)
095
{
096
//删除链表中大于max小于min的值;
097
LinkList p =L->next;
098
LinkList prior = L;
099
while
(p)
100
{
101
if
(p->student.number>max || p->student.number< min)
102
{
103
if
(p->next==NULL)
104
{prior->next=NULL;
break
;}
105
else
106
{prior->next=p->next;p=p->next;}
107
}
108
else
109
{p=p->next;prior=prior->next;}
110
}
111
prior->next=NULL;
112
printf
(
"删除完毕!\n"
);
113
}
114
int
main()
115
{
116
LinkList L1,L2,L3;
117
int
i;
118
//创建链表;
119
L1=
new
LNode;L2=
new
LNode;L3=
new
LNode;
120
CreatList(L1);
121
 
122
//将链表A分为链表B/C,一个元素大于0;一个小于0;
123
/*Fen(L1,L2,L3);
124
Print(L2);Print(L3);*/
125
126
//一趟遍历,确定链表中的最大值;赋值给结构体e;
127
/*Student e;
128
Xun(L1,e);printf("%d\n",e.number);*/
129
130
//通过一趟遍历,将链表中所有的结点的链接方向逆转;
131
/*Ni(L1);Print(L1);*/
132
133
//删除链表中大于max,小于min的值;
134
printf
(
"删除大于max和小于min的值的结点------\n请输入max和min的值:\n"
);
135
int
max,min;
scanf
(
"%d %d"
,&max,&min);
136
Shan(L1,max,min);Print(L1);
137
138
return
0;
139
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: