最近复习了一下链表,觉得应该保留一下自己的代码, 以后忘记了扫一眼。
指针链表
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("
");
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("
");
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("
");
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("
");
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("
");
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("
");
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("
");
83 }
84 }