简单链表及cin。。。

无聊写了一个链表。。

ListTable
 1 typedef struct Node
2 {
3 int value;
4 struct Node* prev;
5 struct Node* next;
6 }iNode;
7
8
9 typedef struct List
10 {
11 iNode* head;
12 }ListTable;
13
14
15 iNode* ListSearch(ListTable* table,int x)
16 {
17 iNode* node=table->head;
18 while(node!=NULL&&node->value!=x)
19 node=node->next;
20 return node;
21 }
22
23
24 void ListInsert(ListTable* table,int x)
25 {
26 iNode* newNode=new iNode;
27 newNode->value=x;
28 newNode->prev=NULL;
29 if(table->head==NULL)
30 {
31 table->head=newNode;
32 newNode->next=NULL;
33 }
34 else
35 {
36 newNode->next=table->head;
37 table->head->prev=newNode;
38 table->head=newNode;
39 }
40 }
41
42
43 void ListDelete(ListTable* table,int x)
44 {
45 iNode* tmp=ListSearch(table,x);
46 if(tmp==NULL)
47 return;
48 else
49 {
50 if(tmp->prev!=NULL)
51 tmp->prev->next=tmp->next;
52 else
53 table->head=tmp->next;
54 if(tmp->next!=NULL)
55 tmp->next->prev=tmp->prev;
56 }
57 }
58
59 void ListShow(ListTable* table)
60 {
61 iNode* node=table->head;
62 while(node!=NULL)
63 {
64 cout <<node->value<<" ";
65 node=node->next;
66 }
67 cout <<endl;
68 }

 

以下是测试程序:

Main
 1 int main()
2 {
3 ListTable* lt=new ListTable;
4 lt->head=NULL;
5 cout <<"entry numbers:";
6 int num,del;
7 while(cin >>num)
8 {
9 ListInsert(lt,num);
10 }
11 ListShow(lt);
12 cout <<"entry the int you wanna delete:";
13 cin.clear();//important
14 cin >>del;
15
16 ListDelete(lt,del);
17 ListShow(lt);
18 system("pause");
19 return 0;
20 }

 

Tips:

1、关于while(cin>>)结束循环的问题
对于cin这个istream对象来说,当从键盘输入一系列字符并按回车之后,这些字符首先被送到输入缓冲区,然后cin就会检测输入缓冲区中是否有可读的数据,cin也会检查是否有流结束标志ctrl+z和ctrl+d。有两种检查方式:阻塞式和非阻塞式。windows下采用ctrl+z,linux下采用ctrl+d。

阻塞式指只有在回车按下之后才检查,非阻塞式指按下ctrl+d后立即响应。

注意,当数据后面紧接着ctrl+d或ctrl+z,按下回车cin会处理输入缓冲区数据,而忽略结束流标志,之后回车后立即输入结束流标志才有效。

2、cin.clear()

将流cin中的所有状态值都重设成有效状态。

posted @ 2011-12-09 18:42  Cavia  阅读(288)  评论(0编辑  收藏  举报