单链表中的节点类型描述如下:
typedef struct link {
int data;
link* next;
}node,*linklist;
- 使用尾插法(头插法)创建一个带头节点(不带头节点)的单链表
void Creat_list_Head(linklist& L) {//创建一个带头节点的单链表
//尾插法
/*int x;
L = (node*)malloc(sizeof(node*));//先创建一个头节点
L->next = NULL;
node* r = L;//用指针r指向链表的最后一个节点
while (cin>>x&&x>0) {
node*s= (node*)malloc(sizeof(node*));
s->data = x;
s->next = r->next;
r->next = s;
r= s;
}*/
//头插法
int x;
L = (node*)malloc(sizeof(node*));//先创建一个头节点
L->next = NULL;
while (cin >> x && x > 0) {
node* s = (node*)malloc(sizeof(node*));//生成一个新节点
s->data = x;
s->next = L->next;
L->next = s;
}
}
- 使用尾插法(头插法)创建一个不带头节点的单链表
void Creat_list_withoutHead(linklist& L) {//创建一个不带头节点的单链表
//头插法
/*int x;
L=NULL;
while (cin >> x&&x > 0) {
node* s = (node*)malloc(sizeof(node*));//生成一个新的头节点
s->data = x;
s->next = L;
L = s;
}*/
//尾插法
int x;
node* r =L;//指针r指向单链表的尾节点
L = NULL;
while (cin >> x && x > 0) {
node* s = (node*)malloc(sizeof(node*));//生成一个新的头节点
s->data = x;
if (L == NULL) {//单链表为空
L = s;
L->next = NULL;
r = s;
}
else {//单链表非空
s->next = r->next;
r->next = s;
r = s;
}
}
}
3.在该单链表(带头节点)的第x个元素前插入一个整数y (从0开始)
void Add_before_x(linklist& L, int x, int y) {//在该单链表的第x个元素前插入一个整数y (从0开始)
node* p = L->next;
int t = 0;
if (x < 0) {
cout << "error 不存在第i个元素 插入失败" << endl;
return;
}
while (p != NULL && t < x - 1) {//找到第x个元素的前一个节点
p = p->next;
t++;
}
if (x == 0) {
p = L;
}
if (p != NULL) {//该链表存在第x-1个节点
node* s = (node*)malloc(sizeof(node*));//生成一个新节点
s->data = y;
s->next = p->next;
p->next = s;
}
else {
cout << "error 不存在第i个元素 插入失败" << endl;
}
}
4.删除单链表(带头节点)中的第i个元素(从0开始)
void Delet_x(linklist& L, int i) {//删除该链表中的第i个元素,其值通过参数将其返回(从0开始)
if (i < 0) {
cout << "error 不存在第i个元素 删除失败" << endl;
return;
}
node* p = L->next;
int t = 0;
while (p != NULL && t < i - 1) {//找到第i-1个节点
p = p->next;
t = t + 1;
}
if (i == 0) {
if (L->next== NULL) {
cout << "error 不存在第i个元素 删除失败" << endl;
return;
}
p = L;
}
if (p == NULL||p->next==NULL) {
cout << "error 不存在第i个元素 删除失败" << endl;
return;
}
node* q = p->next;
p->next = q->next;
//free(q);
}
5.单链表(带头节点)的逆置
void reverse(linklist& L) {
node* p = L->next;
node* rear = NULL;//rear为p节点的后继节点,防止断链
L->next = NULL;
while (p != NULL) {
rear = p->next;
p->next = L->next;
L->next = p;
p = rear;
}
}