文件名:singleLinkList.cpp
代码:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
// 结构体
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode, *LinkList;
// 分配头结点,建立空表
void InitLinkList(LinkList &L) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
}
// 头插法建立单链表
void HeadInsertLinkList(LinkList &L) {
LNode *s;
ElemType x;
printf("请输入你要插入的元素,以0结束: \n");
scanf("%d", &x);
while(x != 0) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d", &x);
}
}
// 尾插法建立单链表
void TailInsertLinkList(LinkList &L) {
LNode *s, *r = L;
ElemType x;
printf("请输入你要插入的元素,以0结束: \n");
scanf("%d", &x);
while(x != 0) {
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d", &x);
}
r->next = NULL;
}
// 单链表长度,不包含头结点
int GetLinkListLength(LinkList L) {
int length = 0;
LNode *s = L->next;
while(s != NULL) {
length++;
s = s->next;
}
return length;
}
// 按序号查找结点:返回第i个结点的指针,若无,返回NULL
LNode *GetLNode(LinkList L, int i) {
int j = 1;
LNode *p = L->next;
int length = GetLinkListLength(L);
if (i < 0 || i > length + 1) {
printf("序号不合法 \n");
return NULL;
}
if (i == 0) {
return L;
}
while(j < i) {
p = p->next;
j++;
}
return p;
}
// 按值查找表结点:返回该结点的指针,若无,返回NULL
LNode *LocationLNode(LinkList L, ElemType e) {
LNode *p = L->next;
while(p && p->data != e) {
p = p->next;
}
return p;
}
// 插入结点(后插):将值为x的新结点插入到单链表的第i个位置上(后插)
void InsertLinkList(LinkList &L, int i, ElemType e) {
int length = GetLinkListLength(L);
LNode *p = GetLNode(L, i-1);
LNode *s = (LNode*)malloc(sizeof(LNode));
if (i < 0 || i > length + 2) {
printf("序号不合法 \n");
return;
}
s->data = e;
s->next = p->next;
p->next = s;
}
// 删除结点(后删):将单链表的第i个结点删除,不可删除头结点
void DeleteLNode(LinkList &L, int i) {
int length = GetLinkListLength(L);
LNode *p = GetLNode(L, i-1), *q;
if (i <= 1 || i > length + 1) {
printf("序号不合法 \n");
return;
}
q = p->next;
p->next = q->next;
free(q);
}
// 输出单链表
void PrintLinkList(LinkList L) {
LNode *s = L->next;
int length = GetLinkListLength(L);
if (length == 0) {
printf("单链表为空 \n");
return;
}
printf("当前单链表元素: ");
while (s != NULL)
{
printf("%d ", s->data);
s = s->next;
}
printf("\n");
}
// 销毁单链表
void DestroyLinkList(LinkList &L) {
LNode *d;
while(L->next != NULL) {
d = L;
L = L->next;
free(d);
}
printf("销毁单链表成功 \n");
}
int main() {
LinkList L;
int i,length;
ElemType e;
LNode *p;
printf("----------------初始化----------------\n");
InitLinkList(L);
printf("----------------头插法建立单链表----------------\n");
HeadInsertLinkList(L);
PrintLinkList(L);
printf("----------------表长----------------\n");
length = GetLinkListLength(L);
printf("当前单链表长度:%d \n", length);
printf("----------------销毁单链表----------------\n");
DestroyLinkList(L);
PrintLinkList(L);
printf("----------------尾插法建立单链表----------------\n");
TailInsertLinkList(L);
PrintLinkList(L);
printf("----------------按序号查找结点----------------\n");
printf("请输入序号:");
scanf("%d", &i);
p = GetLNode(L, i);
printf("查找结点值为:%d \n", p->data);
printf("----------------按值查找结点----------------\n");
printf("请输入值:");
scanf("%d", &e);
p = LocationLNode(L, e);
printf("查找结点值为:%d \n", p->data);
printf("----------------插入结点----------------\n");
printf("请输入序号:");
scanf("%d", &i);
printf("请输入值:");
scanf("%d", &e);
InsertLinkList(L, i, e);
PrintLinkList(L);
printf("----------------删除结点----------------\n");
printf("请输入序号:");
scanf("%d", &i);
DeleteLNode(L, i);
PrintLinkList(L);
return 0;
}