#include<bits/stdc++.h>
using namespace std;
typedef struct Node {
int data;
struct Node *next;
} Node, *LinkList;
LinkList InitList(LinkList L) { //初始化一个带头结点的单链表
L = (LinkList)malloc(sizeof(Node));
if(L == NULL) {
cout << "申请空间失败!" << endl;
exit(-1);
}
L->next = NULL;
return L;
}
void CreateListHead(LinkList *L, int n) { //头插法
LinkList p;
*L = InitList(*L);
for(int i = 0; i < n; i++) {
p = (LinkList)malloc(sizeof(Node));
if(p == NULL) {
cout << "申请空间失败!" << endl;
exit(-1);
}
p->data = i;
p->next = (*L)->next;
(*L)->next = p;
}
}
void CreateListTail(LinkList *L, int n) { //尾插法
LinkList p, r;
*L = (LinkList)malloc(sizeof(Node)); //为整个线性表
r = *L; // r为指向尾部的节点
for(int i = 0; i < n; i++) {
p = (LinkList)malloc(sizeof(Node));
p->data = i;
r->next = p;
r = p;
}
r->next = NULL; //表示当前链表结束
}
//单链表的整表删除
void ClearList(LinkList *L) {
LinkList p, q;
p = (*L)->next;
while(p) {
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL; //将头节点指针域置空
}
//在链表第i个位置插入元素e
void ListInsert (LinkList *L, int i, int e) {
LinkList p;
p = *L;
int j = 1;
while(p && j < i) { //寻找第i-1个节点
p = p->next;
j++;
}
if(!p || i < j) //第i个节点不存在
return;
//生成一个新节点
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
}
//删除第i个元素并用e返回其值
void ListDelete(LinkList *L, int i, int *e) {
LinkList p = *L;
int j = 1;
while(p->next && j < i) { //查找第i-1个节点
p = p->next;
j++;
}
if(!p->next && j < i)
return;
*e = p->next->data;
p->next = p->next->next;
free(p->next);
}
//打印输出链表的值
void PrintList(LinkList L) {
if(!L->next)
cout << "链表为空" << endl;
while(L->next != NULL) {
cout << L->next->data << " ";
L = L->next;
}
cout << endl;
}
int main() {
int n;
cout << "请输入链表元素个数:" << endl;
cin >> n;
LinkList L;
//CreateListHead(&L,n); //头插法
CreateListTail(&L, n); //尾插法
int i, e;
cout << "请输入要插入的元素位置以及值" << endl;
cin >> i >> e;
ListInsert(&L, i, e);
PrintList(L);
int e1;
cout << "请输入要删除的元素位置:" << endl;
cin >> i;
ListDelete(&L, i, &e1);
PrintList(L);
ClearList(&L);
PrintList(L);
return 0;
}
单链表的建立
最新推荐文章于 2023-08-04 19:21:34 发布