建立一个单链表
struct List {
int val; //存值
struct List* next; //存下一个元素的地址
};
函数值的插入与主函数
/* 链表创建 */
void Init(struct List* L) {
int cur;
cin >> cur; //存要插入的值
while (cur != -1) {
//当输入为-1时结束
struct List* ptr = (struct List*)malloc(sizeof(struct List)); //申请空间
ptr->val = cur;
ptr->next = NULL; //指向下一个地址
L->next = ptr; //与链表链接
L = L->next; //改变指针,指向下一个节点
cin >> cur;
}
}
int main() {
struct List* head = (struct List*)malloc(sizeof(struct List)); //头结点(不存值)
head->next = NULL;
Init(head); //初始化链表
return 0;
}
单链表遍历
/* 遍历链表 */
void Show(struct List* L) {
cout << "链表遍历:" ;
while (L->next) {
cout << L->next->val << " ";
L = L->next;
}
cout << endl;
}
插入数值
/* 在第K个位置前插入data元素,最后链表 的第K个位置就是data */
void InsertList (struct List* L, int k, int data) {
struct List* pre = NULL; //存储第K-1个元素的值
struct List* ptr = (struct List*)malloc(sizeof(struct List)); //申请空间
ptr->val = data;
ptr->next = NULL;
while (k && L->next) {
//查找到放置data元素的位置
pre = L;
L = L->next;
k --;
}
if (k > 0) {
//如果K > 0 直接插到链表的表尾
L->next = ptr;
L = L->next;
}else {
pre->next = ptr; //链接链表
ptr->next = L;
}
}
int main() {
struct List* head = (struct List*)malloc(sizeof(struct List)); //头结点(不存值)
head->next = NULL;
Init(head); //初始化链表
Show(head);
int i, data;
cout << "请输入要插入的位置和值:";
cin >> i;
cin >> data;
InsertList(head, i, data); //在第i个位置前插入data
Show(head);
return 0;
}
删除
int lengthList (struct List* L) {
//求链表长度
int len = 0;
while (L->next) {
len ++;
L = L->next;
}
return len;
}
void DeleteList_Position(struct List* L, int k) {
//删除第K个位置的结点
if (lengthList(L) <= 0) {
cout << "表空,没有元素可删除" << endl;
return;
}
struct List* ptr = L->next;
struct List* pre = L; //记录ptr的前一个位置的结点
k = k - 1; //因为如果k = 1,直接用pre->next = ptr->next就把ptr删掉了,所以要减1
while (k-- && ptr) {
pre = ptr;
ptr = ptr->next;
}
if (ptr == NULL || k > 0) {
cout << "要删除的位置不存在" << endl;
}else {
pre->next = ptr->next; //删除ptr结点
free(ptr); //释放空间
}
}
void DeleteList (struct List* L, int x) {
//删除值为x的结点(链表无重复值)
if (lengthList(L) <= 0) {
cout << "表空,没有元素可删除" << endl;
return;
}
struct List* ptr = L->next;
struct List* pre = L; //记录ptr的前一个位置的结点
while (ptr) {
if (ptr->val == x) {
pre->next = ptr->next; //把x值的结点的前一个结点的next指向ptr的next结点
free(ptr); //释放空间
return;
}
pre = ptr;
ptr = pre->next;
}
}