一个关于C语言输入的问题

1.       //程序模块

2.       #include <iostream>

3.       #include <stdio.h>

4.       #include <stdlib.h>

5.       #include <conio.h>

6.       using namespace std;

7.       typedef int DataType;

8.       typedef struct LNode

9.       {

10.   DataType data;

11.   struct LNode *next;

12.   }LNode ,*LinkList;

13.    

14.   //全体子函数声明,像这种这么多子函数的程序为了管理也可以做一个目录子函数(有空再弄,吃饭去)

15.   void InitLink(LinkList &L);

16.   int CreatLink(LinkList &L);

17.   int PushLink(LinkList &L);

18.   int DeleteLink(LinkList &L);

19.   int SearchLink(LinkList L);

20.   int ShowLink(LinkList L);

21.   int SortLink(LinkList &L);

22.   int TogetherLink(void);

23.   int SeparateLink(LinkList &L);

24.    

25.   int main(void)

26.   {

27.   LinkList L;

28.   InitLink(L);           //初始化

29.   CreatLink(L);          //建立链表

30.   ShowLink(L);           //遍历显示链表

31.   PushLink(L);           //插入节点

32.   ShowLink(L);           //遍历显示链表

33.   DeleteLink(L);         //删除节点

34.   ShowLink(L);           //遍历显示链表

35.   SearchLink(L);         //查找节点

36.   SortLink(L);           //排序

37.   SeparateLink(L);       //拆分链表

38.   getch();               //取任意字符

39.   system("cls");         //清空屏幕

40.   TogetherLink();        //合并链表

41.    

42.   return 0;

43.   }

44.    

45.    

46.   //初始化链表

47.   void InitLink(LinkList &L)

48.   {

49.   L=(LinkList)malloc(sizeof(LNode));

50.   if(L==NULL)

51.   {

52.        exit(0);

53.   }

54.   L->data=0;

55.   L->next=NULL;

56.   }

57.    

58.   //创建单链表

59.   int CreatLink(LinkList &L)

60.   {

61.   int i;

62.   LinkList q;

63.   q=L;

64.   printf("请输入链表长度:");

65.   scanf("%d",&L->data);

66.   printf("请输入%d个数据:",L->data);

67.   fflush(stdin);

68.   for(i=0;i<L->data;i++)

69.   {

70.        LinkList p;

71.        p=(LinkList)malloc(sizeof(LNode));

72.        if(p==NULL)

73.        {

74.            exit(0);

75.        }

76.        p->next=NULL;

77.   //  scanf("%d ",&p->data);   //为什么这里用C格式输入会出问题呢??

78.       cin>>p->data;

79.        q->next=p;

80.        q=q->next;

81.   }

82.   return 0;

83.   }

84.    

85.   //选择任意位置插入节点

86.   int PushLink(LinkList &L)

87.   {

88.   int i;

89.   LinkList p,q;

90.   p=L;

91.   printf("插入位置:");

92.   scanf("%d",&i);

93.    

94.   q=(LinkList)malloc(sizeof(LNode));

95.   if(q==NULL)

96.   {

97.        exit(0);

98.   }

99.   q->next=NULL;

100.        printf("插入数据:");

101.        scanf("%d",&q->data);

102.        while(--i)

103.        {

104.            p=p->next;

105.        }

106.        if(!p->next)        //考虑在最后的位置插入

107.        {

108.            p->next=q;

109.        }

110.        else

111.        {

112.            q->next=p->next;

113.            p->next=q;

114.        }

115.     

116.        return 0;

117.    }

118.     

119.     

120.    //选择任意位置删除节点

121.    int DeleteLink(LinkList &L)

122.    {

123.        int i;

124.        LinkList p,q;

125.        p=L;

126.        printf("删除位置:");

127.        scanf("%d",&i);

128.        while(--i)

129.        {

130.            p=p->next;

131.        }

132.        if(!p->next->next)      //考虑删除的是最后一个元素

133.        {

134.            free(p->next->next);

135.            p->next=NULL;

136.        }

137.        else

138.        {

139.            q=p->next;  //q的作用就是为了释放空间

140.            p->next=p->next->next;

141.            free(q);

142.        }

143.        return 0;

144.    }

145.     

146.    //查找节点是否在链表中并指出位置

147.    int SearchLink(LinkList L)

148.    {

149.        int data,count=0;

150.        LinkList p;

151.        p=L;

152.        printf("请输入你要查找的元素:");

153.        scanf("%d",&data);

154.        do

155.        {

156.            p=p->next;

157.            count++;

158.            if(p->data==data)

159.            {

160.                printf("查找成功,该数第一次出现是在链表中第%d位置处。/n",count);

161.                return 0;

162.            }  

163.        }while(p->next);

164.        printf("查找失败,该数不存在链表中!/n");

165.        return 0;

166.    }

167.     

168.    //遍历结果

169.    int ShowLink(LinkList L)

170.    {

171.        LinkList p;

172.        p=L->next;

173.        while(p->next!=NULL)

174.        {

175.            printf("%d ",p->data);

176.            p=p->next;

177.        }

178.        printf("%d/n",p->data);

179.        return 0;

180.    }

181.     

182.     

183.    //链表数据排序--选择排序法

184.    int SortLink(LinkList &L)

185.    {

186.        int temp;

187.        LinkList p,q;

188.    /*  注意:for的使用不能比较最后一个数,如果要用for那么可以先在尾节点处插入一个空数据

189.        for(p=L->next;p->next->next!=NULL;p=p->next)

190.        {

191.            for(q=p->next;q->next!=NULL;q=q->next)

192.            {

193.                if(p->data>q->data)

194.                {

195.                    temp=p->data;

196.                    p->data=q->data;

197.                    q->data=temp;

198.                }

199.            }

200.        }

201.    */

202.        p=L->next;

203.        do{

204.            q=p->next;

205.            do

206.            {

207.                if(p->data>q->data)

208.                {

209.                 temp=p->data;

210.                 p->data=q->data;

211.                 q->data=temp;

212.                }

213.                q=q->next;

214.            }while(q);    //要比到最后一个的

215.     

216.            p=p->next;

217.        }while(p->next);     //注意两个while里面的条件

218.     

219.        printf("排序后链表为:/n");

220.        ShowLink(L);

221.        return 0;

222.    }

223.     

224.    //合并链表

225.    int TogetherLink(void)

226.    {

227.        LinkList L,T,S,p;   //将链表LT合并成链表S且不改变LT本身

228.        InitLink(L);

229.        InitLink(T);

230.        printf("合并链表的第一个链表L信息:/n");

231.        CreatLink(L);

232.        printf("合并链表的第二个链表T信息:/n");

233.        CreatLink(T);

234.        p=L;

235.        S=p;

236.        while(p->next)

237.        {

238.            p=p->next;

239.        }

240.        p->next=T->next;

241.        printf("合并后的链表S如下:/n");

242.        ShowLink(S);

243.        return 0;

244.    }

245.       

246.    //拆分链表

247.    int SeparateLink(LinkList &L)

248.    {

249.        LinkList A,B,p;   //L拆分成AB两个链表

250.        B=(LinkList)malloc(sizeof(LNode));

251.        if(B==NULL)

252.        {

253.            exit(0);

254.        }

255.        int i;

256.        printf("拆分的位置:");

257.        scanf("%d",&i);

258.        p=L;

259.        A=p;

260.        while(i<=0||i>=L->data)

261.        {

262.            printf("输入错误,请重新输入:");

263.            scanf("%d",&i);

264.        }

265.        while(i--)

266.        {

267.            p=p->next;

268.        }

269.        B->next=p->next;

270.        p->next=NULL;

271.        printf("链表一:");

272.        ShowLink(A);

273.        printf("链表二:");

274.        ShowLink(B);

275.        return 0;

276.    }

277.     

278.    这是我最近写的一个关于单链表的程序,但是在创建单链表函数中的那处用C语言输入数据时出一些问题。本来应该测试输入5个数据,那么输入5个数据后就立即执行的,但是程序运行时要输入6个数据按回车键后才开始执行。并且读出来的跳过了第五个数据,个人始终想不明白这是为什么,起初以为是不是缓冲区残留问题。但是加上了清除缓冲的语句后还是不行,最后只好改成C++的输入形式了。路过的高手要是知道为什么会这样,希望能够告知一下,本人由衷感谢。

279.     PSC语言的输入用于排版还是很方便的,但是有些时候总是出现一些莫名其妙的问题。由于是自学的一点点C语言所以很多不明白,不过我还是很喜欢C语言的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值