单链表与双向循环链表应用示例
下面用一个'电话本'小程序,把单链表和双向循环链表的常见操作串起来。代码里包含了初始化、查找、插入、删除、遍历和销毁等基本功能,适合用来理解链表在实际场景中的组织方式。
单链表:电话本的基本实现
这个版本使用带头结点的单链表保存联系人信息。每个结点包含姓名、电话号码和家庭住址三个字段,基本思路很直接:
- 插入时通常采用头插法,方便实现
- 查找时按姓名遍历整条链表
- 删除时需要同时维护前驱结点
- 销毁时要逐个释放动态分配的结点
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
#define false 0
#define true 1
typedef struct ElemType {
char name[30];
char mobile[30];
char addr[30];
} ElemType;
typedef struct LNode {
ElemType data;
LNode* next;
} LNode, *LinkList;
// 带头结点的单链表初始化
bool initLinkList(LinkList &L) {
L = (LNode*)malloc(sizeof(LNode));
if (L) {
L->next = NULL;
return true;
}
return false;
}
// 判断单链表是否为空
bool {
(!(L->next)) ;
;
}
{
length = ;
LNode* p = L->next;
(p) {
++length;
p = p->next;
}
length;
}
{
(!L) ;
(i > (L) + || i < ) ;
p = L;
(; i > ; --i) p = p->next;
;
}
{
(i < || i > (L) + )
;
LNode* elem = (LNode*)((LNode));
elem->data = e;
LNode* p = ;
(L, i, p);
elem->next = p->next;
p->next = elem;
;
}
{
LNode* p = (LNode*)((LNode));
p->data = e;
p->next = L->next;
L->next = p;
;
}
{
flag = ;
LNode *p = L->next;
LNode *pre = L;
(!p) ;
(p) {
(!(name, p->data.name)) {
pre->next = p->next;
(p);
p = pre->next;
flag = ;
} {
p = p->next;
pre = pre->next;
}
}
(flag) ;
;
}
{
LNode* p = L->next;
(!p) ;
(p) {
(!(name, p->data.name)) {
result = p;
;
} {
p = p->next;
}
}
;
}
{
LNode *p = L->next;
(p) {
cout << << p->data.name
<< << p->data.mobile
<< << p->data.addr << endl;
p = p->next;
}
}
{
LNode* p = L->next;
(!p) ;
L->next = ;
(p) {
LNode* q = p->next;
(p);
p = q;
}
}
{
judge = ;
choice = ;
ElemType elem;
name[];
LinkList L;
(L);
cout << << endl;
((, &choice) != EOF) {
(choice == ) {
cout << ;
cin >> name;
LNode *p = ;
judge = (L, p, name);
(judge) {
cout << name << << (*p).data.mobile << << (*p).data.addr << endl;
} {
cout << << endl;
}
} (choice == ) {
cout << << (L) << << endl;
} (choice == ) {
cout << << endl;
cout << ;
cin >> elem.name;
cout << ;
cin >> elem.mobile;
cout << ;
cin >> elem.addr;
((L, elem)) {
cout << << endl;
(L);
} {
cout << << endl;
}
} (choice == ) {
cout << ;
cin >> name;
((L, name)) cout << << endl;
cout << << endl;
} {
(L);
;
}
}
}

