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

问题描述:

  (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//定义的结点类型;
007typedef struct
008{
009    char name[20];
010    int number;
011}Student;
012typedef struct LNode
013{
014    Student student;
015    LNode *next;
016}LNode, *LinkList;
017 
018void 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 
034void 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}
051void 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}
062void 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 
076void 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 
094void 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}
114int 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}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值