双向链表 c
#include <stdio.h>
#include <string.h>
typedef struct person person;
struct person {
char name[10];
int number;
person *next;
person *last;
};
person *p, *q, *start = NULL, *end;
void insert(int num, char nam[10])/* 插入函數,按姓名的首字母順序插入鏈表中的。 */
{
person *q;
q=(person*) malloc(sizeof(struct person));
if (start == NULL) /* 判斷start是否為空 若空則新建 */
{
start = q;
end = q;
p = q;
start->last = NULL;
end->next = NULL;
} else {
if (strcmp(nam, start->name) <= 0)/* 插入鏈表頭 */
{
start->last = q;
q->next = start;
q->last = NULL;
start = q;
} else if (strcmp(nam, end->name) > 0) /* 插入表尾部 */
{
end->next = q;
q->last = end;
end = q;
q->next = NULL;
} else if (strcmp(nam, end->name) < 0 && strcmp(nam, start->name) > 0)/* 插入鏈表中 */
{
for (p = start; strcmp(nam, p->name) > 0; p = p->next)
;
q->next = p;
p->last = q;
for (p = start; p->next != q->next; p = p->next)
;
p->next = q;
q->last = p;
}
}
strcpy(q->name, nam);
q->number = num;
}
void find(int num) /* 按編號查找 */
{
if (start == NULL) {
printf("無記錄\n");
} else {
for (p = start; p != NULL && p->number != num; p = p->next)
;
if (p == NULL) {
printf("不存在的編號!\n");
} else if (p->number == num) {
printf("您查找的編號是:%d\n", num);
printf("該生的姓名為:%s", p->name);
}
}
}
void del(int num) /* 按編號刪除 */
{
for (p = start; p->number != num; p = p->next)
;
if (p->number == num) {
if (p->next == NULL) {
if (p->last == NULL) {
start = NULL;
} else {
(p->last)->next = NULL;
}
free( p );
} else if (p->last == NULL) {
(p->next)->last = NULL;
start = p->next;
free( p );
} else if (p->last != NULL && p->next != NULL) {
(p->last)->next = p->next;
(p->next)->last = p->last;
free( p );
}
}
else {
printf("不存在的編號!\n");
}
}
void print_list() {
printf("學號\t姓名\n");
for (p = start;; p = p->next) {
printf("%d\t%s\n", p->number, p->name);
if (p->next == NULL)
break;
}
}
void insert_node_test() {
int i, num;
char nam[10];
printf("輸入三位學生信息(學號,姓名):");
/*
for (i = 0; i < 3; i++) {
scanf("%d%s", &num, nam);
insert(num, nam);
}
*/
num = 1;
memset(nam,0,sizeof(nam));
strcpy(nam,"abc");
insert(num, nam);
num = 3;
memset(nam,0,sizeof(nam));
strcpy(nam,"world");
insert(num, nam);
num = 2;
memset(nam,0,sizeof(nam));
strcpy(nam,"hello");
insert(num, nam);
print_list();
printf("輸入要刪除的學生的學號:");
scanf("%d", &num);
del(num);
print_list();
printf("輸入要查找的學生的學號:");
scanf("%d", &num);
find(num);
/* print_list(); */
}
轉載于:https://www.cnblogs.com/qunxuan/p/4224378.html
總結
- 上一篇: perl的小知识点
- 下一篇: 三列浮动中间列宽度自适应