用了引用类型 "LinkList &L " 文件是.cpp结尾
LinkList.cpp
//单链表的基本操作(带头结点)
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//结点定义
typedef struct LNode {
ElemType data; //数据域
struct LNode *next; //指针域
} LNode, *LinkList; //LNode是struct LNode的别称,表示结点类型;LinkList是结点指针类型
//1.头插法建立单链表
//LinkList表示返回指针类型,也就是头指针指向的单链表
LinkList List_HeadInsert(LinkList &L) {
L = (LinkList) malloc(sizeof(LNode)); //创建头结点
L->next = NULL;
LNode *s; //新结点指针s
int data;
printf("头插法.请输入结点值:"); //以999输入为结束标志
scanf("%d", &data);
while (data != 999) {
s = (LNode *) malloc(sizeof(LNode)); //创建结点,s指向新结点
s->data = data;
s->next = L->next;
L->next = s;
scanf("%d", &data);
}
return L; //返回指针L(所指向的单链表)
}
//2.尾插法建立单链表
LinkList List_TailList(LinkList &L) {
L = (LinkList) malloc(sizeof(LNode));
L->next = NULL;
LNode *s; //新结点指针s
LNode *r = L; //尾指针r
int data;
printf("尾插法.请输入结点值:"); //以999输入为结束标志
scanf("%d", &data);
while (data != 999) {
s = (LNode *) malloc(sizeof(LNode));
s->data = data;
r->next = s;
r = s;
r->next = NULL;
scanf("%d", &data);
}
return L;
}
//3.求表长
int List_Length(LinkList &L) {
int i = 0;
LNode *p = L;
while (p->next != NULL) {
p = p->next;
i++;
}
return i;
}
//4.打印单链表
void PrintLinkList(LinkList &L) {
LNode *p = L;
if (p->next == NULL) {
printf("该表为空!\n");
}
while (p->next != NULL) {
printf("%d ", p->next->data);
p = p->next;
}
printf("\n");
}
//5.按序号第i个查找结点
LNode *GetElem(LinkList &L, int i) {
if (i < 1 || List_Length(L)==0) { //判断i是否非法 或 链表是否为空
return NULL;
}
int j = 1; //计数
LNode *p = L->next; //p从首元结点开始
while (p != NULL && j < i) {
p = p->next;
j++;
}
return p;
}
//6.按值data查找结点
LNode *LocateElem(LinkList &L, int data) {
if (L->next == NULL) { //判空
return NULL;
}
LNode *p = L->next;
while (p != NULL) {
if (p->data == data) {
return p;
}
p = p->next;
}
return p;
}
//7.插入结点操作,第i个位置插入data
LinkList List_Insert(LinkList &L, int i, int data) {
if (GetElem(L, i - 1) != NULL) { //有效位置判断
LNode *s = (LNode *) malloc(sizeof(LNode)); //待插入结点s
s->data = data;
LNode *p = GetElem(L, i - 1); //第i个结点的前面一个节点p
s->next = p->next;
p->next = s;
printf("插入成功!");
return L;
} else {
printf("插入失败!\n");
return L;
}
}
//8.删除操作,删除第i个结点
LinkList List_Delete(LinkList &L, int i) {
if (i < 1 || i > List_Length(L)) {
printf("删除失败!");
return L;
}
LNode *p = GetElem(L, i - 1);//待删除结点前一结点指针p
LNode *q = GetElem(L, i ); //待删除结点指针q
p->next=q->next;
free(q);
printf("删除成功!");
return L;
}
int main() {
LinkList L;//头指针
//1.头插法建立单链表
//List_HeadInsert(L); //头指针L传入,引用类型形参L接收
//2.尾插法建立单链表
List_TailList(L);
//3.求表长
printf("表长为:%d\n", List_Length(L));
//4.打印单链表
printf("打印单链表:");
PrintLinkList(L);
//5.按序号查找结点并返回
LNode *p1 = GetElem(L, 2);
printf("按序查找结果为:%d\n", p1->data);
//6.按值查找并返回结点
LNode *p2 = LocateElem(L, 7);
if (p2 != NULL) {
printf("按值查找结果为:%d\n", p2->data);
} else {
printf("未找到该值!\n");
}
//7.插入结点操作
printf("执行插入操作后:\n");
List_Insert(L, 7, 12);
PrintLinkList(L);
//8.删除操作,删除第i个结点
printf("执行删除操作后:\n");
List_Delete(L,4);
PrintLinkList(L);
return 0;
}