1.请编程实现单向循环链表的头插、头删、尾插、尾删
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 typedef int datatype;
5 typedef struct Node
6 {
7 datatype data;//数据域
8 struct Node *next;//指针域
9 }*Linklist;
10 Linklist create();
11 Linklist insert_head(Linklist head,datatype element);
12 void output(Linklist head);
13 Linklist insert_rear(Linklist head,datatype element);
14 Linklist delete_head(Linklist head);
15 Linklist delete_rear(Linklist head);
16 int main(int argc, const char *argv[])
17 {
18 Linklist head=NULL;//定义单向循环链表头指针
19 int n;
20 printf("please enter n:");
21 scanf("%d",&n);
22 datatype element;
23 /* //头插
24 for(int i=0;i<n;i++)
25 {
26 printf("please enter %d element:",i+1);
27 scanf("%d",&element);
28 head=insert_head(head,element);
29 }
30 //遍历
31 output(head);*/
32 //尾插
33 for(int i=0;i<n;i++)
34 {
35 printf("please enter %d element:",i+1);
36 scanf("%d",&element);
37 head=insert_rear(head,element);
38 }
39 output(head);
40 //头删
41 head=delete_head(head);
42 output(head);
43 //尾删
44 head=delete_rear(head);
45 output(head);
46 return 0;
47 }
48 //创建节点s
49 Linklist create()
50 {
51 Linklist s=(Linklist)malloc(sizeof(struct Node));
52 if(NULL==s)
53 return NULL;
54 s->data=0;
55 s->next=s;
56 return s;
57 }
58 //头插
59 Linklist insert_head(Linklist head,datatype element)
60 {
61 Linklist s=create();
62 s->data=element;
63 if(NULL==head)
64 head=s;
65 else
66 {
67 Linklist p=head;
68 while(p->next!=head)
69 p=p->next;
70 s->next=head;
71 head=s;
72 p->next=head;
73 }
74 return head;
75 }
76 //遍历
77 void output(Linklist head)
78 {
79 if(NULL==head)
80 {
81 puts("empty");
82 return;
83 }
84 Linklist p=head;
85 do
86 {
87 printf("%-4d",p->data);
88 p=p->next;
89 }while(p!=head);
90 puts("");
91 }
92 //尾插
93 Linklist insert_rear(Linklist head,datatype element)
94 {
95 Linklist s=create();
96 s->data=element;
97 if(NULL==head)
98 head=s;
99 else
100 {
101 Linklist p=head;
102 while(p->next!=head)
103 p=p->next;
104 p->next=s;
105 s->next=head;
106 }
107 return head;
108 }
109 //头删
110 Linklist delete_head(Linklist head)
111 {
112 if(NULL==head)
113 return head;
114 else
115 {
116 Linklist p=head;
117 while(p->next!=head)
118 p=p->next;
119 Linklist del=head;
120 head=head->next;
121 free(del);del=NULL;
122 p->next=head;
123 }
124 return head;
125 }
126 //尾删
127 Linklist delete_rear(Linklist head)
128 {
129 if(NULL==head)
130 {
131 puts("empty");
132 return head;
133 }
134 else if(head==head->next)
135 {
136 free(head);
137 head=NULL;
138 return head;
139 }
140 else
141 {
142 Linklist del=head;
143 while(del->next->next!=head)
144 del=del->next;
145 free(del->next);
146 del->next=head;
147 return head;
148 }
149
150 }
效果显示:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 typedef int datatype;
5 typedef struct Node
6 {
7 datatype data;//数据域
8 struct Node *next;//指针域
9 }*Linklist;
10 Linklist create();
11 Linklist insert_head(Linklist head,datatype element);
12 void output(Linklist head);
13 Linklist insert_rear(Linklist head,datatype element);
14 Linklist delete_head(Linklist head);
15 Linklist delete_rear(Linklist head);
16 Linklist john(Linklist head,int n,int m);
17 int main(int argc, const char *argv[])
18 {
19 Linklist head=NULL;//定义单向循环链表头指针
20 int n;
21 printf("please enter n:");
22 scanf("%d",&n);
23 datatype element;
24 /* //头插
25 for(int i=0;i<n;i++)
26 {
27 printf("please enter %d element:",i+1);
28 scanf("%d",&element);
29 head=insert_head(head,element);
30 }
31 //遍历
32 output(head);*/
33 //尾插
34 for(int i=0;i<n;i++)
35 {
36 printf("please enter %d element:",i+1);
37 scanf("%d",&element);
38 head=insert_rear(head,element);
39 }
40 output(head);
41 /* //头删
42 head=delete_head(head);
43 output(head);
44 //尾删
45 head=delete_rear(head);
46 output(head);*/
47 //约瑟夫环
48 int m;
49 printf("please enter m:");
50 scanf("%d",&m);
51 head=john(head,n,m);
52 puts("");
53 return 0;
54 }
55 //创建节点s
56 Linklist create()
57 {
58 Linklist s=(Linklist)malloc(sizeof(struct Node));
59 if(NULL==s)
60 return NULL;
61 s->data=0;
62 s->next=s;
63 return s;
64 }
65 //头插
66 Linklist insert_head(Linklist head,datatype element)
67 {
68 Linklist s=create();
69 s->data=element;
70 if(NULL==head)
71 head=s;
72 else
73 {
74 Linklist p=head;
75 while(p->next!=head)
76 p=p->next;
77 s->next=head;
78 head=s;
79 p->next=head;
80 }
81 return head;
82 }
83 //遍历
84 void output(Linklist head)
85 {
86 if(NULL==head)
87 {
88 puts("empty");
89 return;
90 }
91 Linklist p=head;
92 do
93 {
94 printf("%-4d",p->data);
95 p=p->next;
96 }while(p!=head);
97 puts("");
98 }
99 //尾插
100 Linklist insert_rear(Linklist head,datatype element)
101 {
102 Linklist s=create();
103 s->data=element;
104 if(NULL==head)
105 head=s;
106 else
107 {
108 Linklist p=head;
109 while(p->next!=head)
110 p=p->next;
111 p->next=s;
112 s->next=head;
113 }
114 return head;
115 }
116 //头删
117 Linklist delete_head(Linklist head)
118 {
119 if(NULL==head)
120 return head;
121 else
122 {
123 Linklist p=head;
124 while(p->next!=head)
125 p=p->next;
126 Linklist del=head;
127 head=head->next;
128 free(del);del=NULL;
129 p->next=head;
130 }
131 return head;
132 }
133 //尾删
134 Linklist delete_rear(Linklist head)
135 {
136 if(NULL==head)
137 {
138 puts("empty");
139 Linklist john(Linklist head,int n,int m)
140 return head;
141 }
142 else if(head==head->next)
143 {
144 free(head);
145 head=NULL;
146 return head;
147 }
148 else
149 {
150 Linklist del=head;
151 while(del->next->next!=head)
152 del=del->next;
153 free(del->next);
154 del->next=head;
155 return head;
156 }
157
158 }
159 //约瑟夫环
160 Linklist john(Linklist head,int n,int m)
161 {
162 if(NULL==head)
163 return head;
164 Linklist p=head;
165 for(int i=0;i<n;i++)
166 {
167 for(int j=0;j<m-2;j++)
168 p=p->next;
169 Linklist del=p->next;
170 printf("%-4d",del->data);
171 p->next=del->next;
172 free(del);del=NULL;
173 p=p->next;
174 }
175 return NULL;
176 }
效果显示:
3.请用编程实现单向循环链表的排序
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node
{
datatype data;
struct Node* next;
} *sqlist;
sqlist create_node()
{
sqlist node = (sqlist)malloc(sizeof(struct Node));
if (NULL == node)
{
return NULL;
}
node->next = NULL;
return node;
}
sqlist head_insert(sqlist head, datatype element)
{
sqlist p = create_node();
if (NULL == p)
{
puts("头插:头插失败");
return head;
}
printf("头插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
head->next = head;
}
else
{
sqlist q = head;
while (q->next != head)
{
q = q->next;
}
p->next = head;
head = p;
q->next = head;
}
return head;
}
sqlist head_delete(sqlist head)
{
if (NULL == head)
{
puts("头删:空链表");
return NULL;
}
if (head == head->next)
{
printf("头删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
sqlist p = head;
while (p->next != head)
{
p = p->next;
}
sqlist q = head;
head = head->next;
p->next = head;
printf("头删:%d\n", q->data);
free(q);
q = NULL;
return head;
}
sqlist tail_insert(sqlist head, datatype element)
{
sqlist p = create_node();
if (NULL == p)
{
puts("尾插:尾插失败");
return head;
}
printf("尾插:%d\n", element);
p->data = element;
if (NULL == head)
{
head = p;
head->next = head;
return head;
}
sqlist q = head;
while (q->next != head)
{
q = q->next;
}
q->next = p;
p->next = head;
return head;
}
sqlist tail_delete(sqlist head)
{
if (NULL == head)
{
puts("尾删:空链表");
return NULL;
}
if (head == head->next)
{
printf("尾删:%d\n", head->data);
free(head);
head = NULL;
return head;
}
sqlist p = head;
while (p->next->next != head)
{
p = p->next;
}
sqlist q = p->next;
p->next = head;
printf("尾删:%d\n", q->data);
free(q);
q = NULL;
return head;
}
void show(sqlist head)
{
if (NULL == head)
{
puts("空链表");
return;
}
sqlist p = head;
printf("展示:");
do
{
printf("%2d", p->data);
p = p->next;
}
while (p != head);
puts("");
}
void sort(sqlist head)
{
if (NULL == head)
{
puts("展示:空链表");
return;
}
if (head == head->next)
{
return;
}
for (sqlist p = head; p->next != head; p = p->next)
{
for (sqlist q = p->next; q != head; q = q->next)
{
if (p->data > q->data)
{
p->data += q->data;
q->data = p->data - q->data;
p->data -= q->data;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
sqlist head = NULL;
int element;
for (int i = 0; i < n; i++)
{
scanf("%d", &element);
head = head_insert(head, element);
}
show(head);
sort(head);
show(head);
return 0;
}
效果显示: