链表

最近复习了一下链表,觉得应该保留一下自己的代码, 以后忘记了扫一眼。

指针链表

 1 #include<cstdio>
 2 #include<cstdlib>
 3 struct note
 4 {
 5     int data;
 6     struct note *next;
 7 };
 8 int main()
 9 {
10     int n;
11     scanf("%d", &n);
12     struct note *head, *p, *q;
13     head=(struct note *)malloc(sizeof(struct note));
14     head->next=NULL;
15     int temp;
16 // 输入n个从小到大的数,用链表初始化 
17     for(int i=1; i<=n; i++)
18     {
19         scanf("%d", &temp);
20         p=(struct note *)malloc(sizeof(struct note));
21         p->data=temp;
22         p->next=NULL;
23         if(head->next==NULL)
24             head->next=p;
25         else
26             q->next=p;
27         q=p;
28     }
29     struct note *t=head->next;
30     while(t!=NULL)
31     {
32         printf("%d ", t->data);
33         t=t->next;
34     }
35     printf("\n");
36 // 插入一个数字,并输出排序后结果,输入0结束 
37     while(scanf("%d", &temp) && temp!=0)
38     {
39         t=head;
40         while(1)
41         {
42             if(t->next==NULL)
43             {
44                 p=(struct note *)malloc(sizeof(struct note));
45                 p->data=temp;
46                 p->next=NULL;
47                 t->next=p;
48                 t=head->next;
49                 while(t!=NULL)
50                 {
51                     printf("%d ", t->data);
52                     t=t->next;
53                 }
54                 printf("\n");
55                 break;
56             }
57             if(t->next->data>temp)
58             {
59                 p=(struct note *)malloc(sizeof(struct note));
60                 p->data=temp;
61                 p->next=t->next;
62                 t->next=p;
63                 t=head->next;
64                 while(t!=NULL)
65                 {
66                     printf("%d ", t->data);
67                     t=t->next;
68                 }
69                 printf("\n");
70                 break;
71             }
72             t=t->next;
73         }
74     }
75 }

 

 数组模拟链表(效果同上)

 1 #include<cstdio>
 2 int data[105], right[105];
 3 int main()
 4 {
 5     int n;
 6     scanf("%d", &n);
 7     for(int i=1; i<=n; i++)
 8         scanf("%d", &data[i]);
 9     for(int i=0; i<=n; i++)
10     {
11         if(i!=n)
12             right[i]=i+1;
13         else
14             right[i]=0;
15     }
16     int t=1;
17     while(t!=0)
18     {
19         printf("%d ", data[t]);
20         t=right[t];
21     }
22     printf("\n");
23     int temp;
24     int len=n;
25     while(scanf("%d", &data[++len]) && data[len]!=0)
26     {
27         t=0;
28         while(1)
29         {
30             if(right[t]==0)
31             {
32                 right[len]=0;
33                 right[t]=len;
34                 break;
35             }
36             if(data[len]<data[right[t]])
37             {
38                 right[len]=right[t];
39                 right[t]=len;
40                 break;
41             }
42             t=right[t];
43         }
44         t=0;
45         while(1)
46         {
47             t=right[t];
48             if(t==0)
49                 break;
50             printf("%d ", data[t]);
51 
52         }
53         printf("\n");
54     }
55 }

 双向链表

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int right[100], left[100];
 5 void link(int l, int r)
 6 {
 7     left[r]=l;
 8     right[l]=r;
 9 }
10 int main()
11 {
12     int n;
13 // 输入n,表示链表里有1-n的数字 
14     scanf("%d", &n);
15     for(int i=1; i<=n; i++)
16     {
17         left[i]=i-1;
18         right[i]=(i+1)%(1+n);
19     }
20     left[0]=n;
21     right[0]=1;
22     int t=0;
23     while(1)
24     {
25         t=right[t];
26         printf("%d ", t);
27         if(right[t]==0)
28         {
29             printf("\n");
30             break;
31         }
32     }
33 
34     while(1)
35     {
36         int op, x, y;
37 //  输入指令对应操作,op=0将x放在y的左边,op=1将x放在y的右边,op=2将x,y交换位置
38         scanf("%d%d%d", &op, &x, &y);
39         if(op==2 && right[y]==x)
40             swap(x, y);
41         int LX, RX, LY, RY;
42         LX=left[x];
43         RX=right[x];
44         LY=left[y];
45         RY=right[y];
46         if(op==0 && LY!=x)
47         {
48             link(LX, RX);
49             link(LY, x);
50             link(x, y);
51         }
52         else if(op==1 && RY!=x)
53         {
54             link(LX, RX);
55             link(x, RY);
56             link(y, x);
57         }
58         else if(op==2)
59         {
60             if(RX==y)
61             {
62                 link(LX, y);
63                 link(y, x);
64                 link(x, RY);
65             }
66             else
67             {
68                 link(LX, y);
69                 link(y, RX);
70                 link(LY, x);
71                 link(x, RY);
72             }
73         }
74         int t=0;
75         while(1)
76         {
77             t=right[t];
78             printf("%d ", t);
79             if(right[t]==0)
80                 break;
81         }
82         printf("\n");
83     }
84 }

 

posted @ 2018-08-03 11:15  paranoid。  阅读(145)  评论(0编辑  收藏  举报