1.结构体定义
typedef struct LNode{
int data;
LNode* next;
}*LinkList,LNode;
LinkList 强调它是一个单链表,LNode强调是一个结点 。
以下是带头结点的单链表的所有操作
2.基本操作
2.1 初始化
//带头结点的初始化
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL) {
return true;
}
L->next = NULL;
return true;
}
2.2 尾插法创建一个单链表
//尾插法创建一个单链表
bool TailInsert(LinkList L) {
int num = 0;
int ele = 0;
LNode* p = L;
printf("请输入你要插入的元素个数:\n");
scanf("%d", &num);
for (int i = 0; i < num; i++) {
printf("请输入第%d个元素: ",i+1);
scanf("%d", &ele);
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) {
return false;
}
s->data = ele;
s->next = NULL;
p->next = s;
p = p->next;
}
return true;
}
2.3 头插法建立一个单链表
L指针指向链表的头结点,s为要插入的结点
//头插法建立一个单链表
bool HeadInsert(LinkList L) {
int num = 0;
int ele = 0;
LNode* p = L;
printf("请输入你要插入的元素个数:\n");
scanf("%d", &num);
for (int i = 0; i < num; i++) {
printf("请输入第%d个元素: ", i + 1);
scanf("%d", &ele);
LNode* s = (LNode*)malloc(sizeof(LNode));
if (s == NULL) { //创建结点失败
return false;
}
s->data = ele;
s->next = L->next;
L->next = s;
}
return true;
}
2.4在第i个位置插入一个元素
bool ListInsert(LinkList &L,int i,int e) {
if (i < 1) {
return false;
}
LNode* p=L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
j++;
}
if (p == NULL) { //如果i大于单链表的长度,导致p指向最大长度就为NULL,直接返回false
return false;
}
LNode* s= (LNode*) malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
2.5得到一个位置为i的元素
//得到一个位置为i的元素
LNode* GetElem(LinkList& L, int i) {
if (i < 0) {
return NULL;
}
LNode* p=L;
int j = 0;
while (p != NULL && j < i ) {
p = p->next;
j++;
}
if (p == NULL) { //找不到返回NULL
return NULL;
}
return p;
}
2.6删除第i个位置的元素
//删除第i个位置的元素
bool DeleteNode(LinkList& L, int i,int &e) {
if (i < 1) {
return false;
}
LNode* p = L;
int j = 0;
while (p != NULL && j < i-1) { //找到i-1位置的元素
p = p->next;
j++;
}
if (p == NULL) { //找不到要删除的元素,返回false
return false;
}
LNode* q = p->next; //使q指针指向要删除的元素
e = q->data;
p->next = q->next;
free(q);
return true;
}
2.7遍历一个单链表
//遍历一个单链表
void TranverseLinkList(LinkList L) {
LNode* p = L->next;
printf("单链表序列为:");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
}