#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#pragma once
using namespace std;
0.单链表结构体
typedef struct Linknode {
int info;
struct Linknode* next;
}*Link;
1.头插法创建单链表
不带头节点
Link create1() {
struct Linknode* head, * p;
head = (Link)malloc(sizeof(Linknode));
head = NULL;
int info;
printf("999");
scanf("%d", &info);
while (info != 999)
{
p = (Link)malloc(sizeof(Linknode));
p->info = info;
p->next = head;
head = p;
scanf("%d", &info);
}
return head;
}
带头结点
Link create2() {
Linknode* head, * p;
head = (Link)malloc(sizeof(Linknode));
head->next = NULL;
int info;
printf("999");
scanf("%d", &info);
while (info != 999)
{
p = (Link)malloc(sizeof(Linknode));
p->info = info;
p->next = head->next;
head->next= p;
scanf("%d", &info);
}
return head;
}
2.尾插法创建单链表
不带头结点
Link create3()
{
Linknode* head, * rear, * p;
head = (Link)malloc(sizeof(Linknode));
int info;
head=rear= NULL;
printf("999");
scanf("%d", &info);
while (info != 999)
{
p = (Link)malloc(sizeof(Linknode));
p->info = info;
if (head == NULL)
head = p;
else
rear->next = p;
rear = p;
scanf("%d", &info);
}
rear ->next = NULL;
return head;
}
带头结点
Link create4()
{
Linknode* head, * rear, * p;
head = (Link)malloc(sizeof(Linknode));
head->next = NULL;
rear = head;
int info;
printf("输入999结束\n");
scanf("%d", &info);
while (info != 999)
{
p = (Link)malloc(sizeof(Linknode));
p->info = info;
rear->next = p;
rear = p;
scanf("%d", &info);
}
rear->next = NULL;
return head;
}
3.查找第i个结点的地址
带头结点
Link find1(Linknode *head,int i)
{
int j = 0;
Linknode *p = head;
if (i < 0)
{
printf("不存在第i个结点");
return NULL;
}
else if (i == 0)
{
return p;
}
while (p && i != j)
{
p = p->next;
j++;
}
return head;
}
不带头结点
Link find2(Linknode* head, int i)
{
int j = 1;
Linknode* p = head;
if (i < 1)
return NULL;
else if (i == 1)
return p;
while (p && j!=i)
{
p = p->next;
j++;
}
return p;
}
4.输出各个结点的值
不带头结点
void disp1(Linknode* head)
{
Linknode* p = head;
if (!p)
printf("空");
else
{
printf("\n");
while (p)
{
printf("%d", p->info);
p = p->next;
}
printf("\n");
}
}
带头结点
void disp(Linknode* head)
{
Linknode* p = head->next;
if (!p)
printf("空");
else
{
printf("\n");
while (p)
{
printf("%d", p->info);
p = p->next;
}
printf("\n");
}
}
5.单链表删除第一个值为x的结点
带头
Link delX1(Linknode* head, int x)
{
Linknode* q, * pre = head;
q = head->next;
while (q && q->info != x)
{
pre = q;
q = q->next;
}
if (q)
{
pre->next = q->next;
free(q);
}
return head;
}
不带头
Link delX2(Linknode* head, int x)
{
Linknode* q, * pre = NULL;
if (head == NULL)
{
printf("空");
return head;
}
q = head;
while (q&& q->info != x)
{
pre = q;
q = q->next;
}
if (q)
{
if (!pre)
head = head->next;
else
{
pre->next = q->next;
}
free(q);
}
return head;
}
6.单链表插入x结点
带头
Link insert1(Linknode* head,int i,int x)
{
Linknode* q, * p;
int j = 0;
q=find1(head, i);
if (!q)
printf("不存在此结点");
else {
p = (Link)malloc(sizeof(Linknode));
p->info = x;
p->next = q->next;
q->next = p;
}
return head;
}
不带头
Linknode* insert2(Linknode* head, int i, int x)
{
Linknode* p, * q;
q = find2(head, i);
if (!q&&i!=0)
printf("此结点不存在");
else
{
p = (Link)malloc(sizeof(Linknode));
p->info = x;
if (i == 0)//如果为空表
{
head->next = p;
head = p;
}
else
{
p->next = q->next;
q->next = p;
}
}
return p;
}
7.求带头节点单链表结点个数
int length(Linknode* head)
{
int count = 0;
Linknode* p = head->next;
while (p)
{
count++;
p = p->next;
}
return count;
}
8.求单链表结点个数
int length2(Linknode* head)
{
int count = 0;
Linknode* p = head;
if (!p)
return 0;
else {
count++;
while (p) {
count++;
p = p->next;
}
}
return count;
}
9.在单链表中值为y的结点前面插入x结点,使x成为它的前驱结点。
void insertXY(Linknode* head, int x, int y)
{
Linknode *p, *pre, *s;
pre = head;
p = head->next;
while (p && p->info != y)
{
pre = p;
p = p->next;
}
if (p)
{
s = (Link)malloc(sizeof(Linknode));
s->info = x;
s->next = p;
pre->next = s;
}
}
10.判断单链表是否有序(升序、降序)
int isSort(Linknode* head)
{
Linknode * f=head->next, * r=f->next;
while (r)
{
if (f->info <= r->info)
{
f = f->next;
r = f->next;
}
else
return 0;
}
return 1;
}
11.原地逆置单链表
void reverse(Linknode* head)
{
Linknode* p, * r;
p = head->next;
head->next = NULL;
while (p)
{
r = p->next;
p->next = head->next;
head->next = p;
p = r;
}
}
void del1(Linknode*& head, int x, int y) {
Linknode* pre;
if (head == NULL && x < y) return;
if (head->info > x && head->info < y)
{
pre = head;
head = head->next;
free(pre);
del1(head, x, y);
}
else
{
del1(head->next, x, y);
}
}
void del2(Linknode*& head, int x, int y) {
Linknode* p = head->next, * r = head;
while (p)
{
if (p->info>x && p->info<y) {
r->next = p->next;
free(p);
p = r->next;
}
else
{
r = p;
p = p->next;
}
}
}