单链表的基本操作
单链表的结构
typedef struct node {
int data;
struct node *next;
}Node;
单链表的创建(头插法)
bool CreatList(Node *l) {
if (l==NULL)
{
return false;
}
printf("请输入链表的长度:");
int len;
scanf("%d", &len);
l->next = NULL;
l->data = len;
Node *p;
srand((int)time(0));
for (int i = 0; i < len; i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = l->next;
l->next = p;
}
return true;
}
单链表的创建(尾插法)
bool CreatList(Node *l) {
if (l==NULL)
{
return false;
}
printf("请输入链表的长度:");
int len;
scanf("%d", &len);
l->next = NULL;
l->data = len;
Node *q = l;
Node *p;
srand((int)time(0));
for (int i = 0; i < len; i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
q->next = p;
q = p;
}
q->next = NULL;
return true;
}
获取单链表的长度
int LengthList(Node *l) {
Node *p = l->next;
int i = 0;
while (p)
{
i++;
p = p->next;
}
return i;
}
单链表的插入(在某个节点后插入)
bool InsertData(Node *l, int i, int data) {
Node *p = l->next;
int j = 0;
while (p&&j<i-1)
{
j++;
p = p->next;
}
if (p==NULL||j>i-1)
{
return false;
}
Node *q = (Node *)malloc(sizeof(Node));
q->data = data;
q->next = p->next;
p->next = q;
return true;
}
单链表删除某个节点(根据下标删除当前节点)
bool DeleteByData(Node *l, int i) {
Node *p = l->next;
int j = 1;
while (p&&j<i-1)
{
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
{
return false;
}
Node *q = p->next;
p->next = q->next;
free(q);
return true;
}
根据下标获取当前节点的值
int GetByIndex(Node *l, int i) {
Node *p = l->next;
int j = 1;
while (p&&j<i-1)
{
j++;
p = p->next;
}
if (p == NULL || j > i - 1)
{
return -1;
}
return p->next->data;
}
根据下标修改当前节点的值
bool UpdataByIndex(Node *l, int i, int data) {
Node *p = l->next;
int j = 1;
while (p&&j < i - 1)
{
j++;
p = p->next;
}
if (p == NULL || j > i - 1)
{
return false;
}
p->next->data = data;
return true;
}
判断当前连表是否为空
bool IsEmpty(Node *l) {
Node *p = l->next;
if (p==NULL)
{
return false;
}
return true;
}
清空单链表
void ClearList(Node *l) {
Node *p = l->next;
if (p==NULL||l==NULL)
{
printf("\n单链表为空\n");
}
else {
Node *q;
while (p)
{
q = p->next;
free(p);
p = q;
}
l->next = NULL;
printf("\n全部清空\n");
}
}
对单链表进行排序
void SortList(Node *l) {
Node *p, *q;
int temp;
for (p = l->next;p!=NULL;p = p->next)
{
for (q = p; q != NULL; q = q->next) {
if (p->data>q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
printf("\n排序后的数据为:\n");
printfList(l);
}
根据值查找元素的下标
int SearchByData(Node *l, int data) {
Node *p = l->next;
int i = 1;
while (p)
{
if (p->data == data)
{
return i;
}
i++;
p = p->next;
}
return -1;
}
根据值删除节点
bool DeleteByData(Node *l, int data) {
Node *p = l->next;
int i = 1;
while (p)
{
if (p->data==data)
{
if (DeleteByIndex(l, i))
{
return true;
}
}
i++;
p = p->next;
}
return false;
}
bool DeleteByIndex(Node *l, int i) {
Node *p = l->next;
int j = 1;
while (p&&j<i-1)
{
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
{
return false;
}
Node *q = p->next;
p->next = q->next;
free(q);
return true;
}
遍历单链表
void printfList(Node *l) {
Node *p = l->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
删除指定范围内的元素的值
void DeleteList(Node *l, int min, int max) {
Node *p = l;
Node *q = l->next;
while (q)
{
if (q->data<min || q->data>max) {
p->next = q;
p = q;
q = q->next;
}
else {
Node *l1 = q;
q = q->next;
free(l1);
}
}
p->next = NULL;
}
全部代码展示
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
typedef struct node {
int data;
struct node *next;
}Node;
bool CreatList(Node *l);
int LengthList(Node *l);
bool InsertData(Node *l, int i, int data);
bool DeleteByIndex(Node *l, int i);
int GetByIndex(Node *l, int i);
bool UpdataByIndex(Node *l, int i, int data);
bool IsEmpty(Node *l);
void printfList(Node *l);
void ClearList(Node *l);
void SortList(Node *l);
int SearchByData(Node *l, int data);
bool DeleteByData(Node *l, int data);
int main() {
bool flag = true;
int choice;
int i;
int data;
Node *l = (Node *)malloc(sizeof(Node));
while (flag)
{
printf("\n=====单链表的基本操作=====\n");
printf("1.单链表的创建\n");
printf("2.单链表的长度\n");
printf("3.单链表的插入(在某个节点后)\n");
printf("4.单链表的删除(删除某个节点)\n");
printf("5.获取某个节点位置的值\n");
printf("6.根据指定下标修改元素的值\n");
printf("7.判断单链表是否为空\n");
printf("8.清空单链表\n");
printf("9.单链表的遍历\n");
printf("10.单链表的排序\n");
printf("11.获取某个节点的下标\n");
printf("12.删除单链表中指定的值\n");
printf("13.退出程序\n");
printf("============================\n");
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
if (CreatList(l))
{
printf("\n单链表创建成功\n");
}
else {
printf("\n单链表创建失败\n");
}
break;
case 2:
printf("\n单链表的长度为:%d\n", LengthList(l));
break;
case 3:
printf("i,data=");
scanf("%d", &i);
scanf("%d", &data);
if (InsertData(l, i, data))
{
printf("\n插入成功\n");
}
else {
printf("\n插入失败\n");
}
break;
case 4:
printf("i = ");
scanf("%d", &i);
if (DeleteByIndex(l, i))
{
printf("\n删除成功\n");
}
else {
printf("\n删除失败\n");
}
break;
case 5:
printf("i = ");
scanf("%d", &i);
if (GetByIndex(l, i)!=-1)
{
printf("\n%d 位置的值为:%d\n", i, GetByIndex(l, i));
}
break;
case 6:
printf("i,data=");
scanf("%d", &i);
scanf("%d", &data);
if (UpdataByIndex(l, i,data))
{
printf("\n修改成功\n");
}
else {
printf("\n修改失败\n");
}
break;
case 7:
if (IsEmpty(l))
{
printf("\n单链表不为空\n");
}
else {
printf("\n单链表为空\n");
}
break;
case 8:
ClearList(l);
break;
case 9:
printfList(l);
break;
case 10:
SortList(l);
break;
case 11:
printf("data = ");
scanf("%d", &data);
if (SearchByData(l, data)!=-1)
{
printf("\n%d 的下标为:%d\n", data, SearchByData(l, data));
}
else {
printf("\n找不到该值\n");
}
break;
case 12:
printf("data = ");
scanf("%d", &data);
if (DeleteByData(l, data))
{
printf("\n删除成功\n");
}
else {
printf("\n没有找到该数据\n");
}
break;
case 13:
flag = false;
break;
}
}
printf("\n退出程序。。。。。。。。。。\n");
}
bool CreatList(Node *l) {
if (l==NULL)
{
return false;
}
printf("请输入链表的长度:");
int len;
scanf("%d", &len);
l->next = NULL;
l->data = len;
Node *q = l;
Node *p;
srand((int)time(0));
for (int i = 0; i < len; i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
q->next = p;
q = p;
}
q->next = NULL;
return true;
}
int LengthList(Node *l) {
Node *p = l->next;
int i = 0;
while (p)
{
i++;
p = p->next;
}
return i;
}
bool InsertData(Node *l, int i, int data) {
Node *p = l->next;
int j = 0;
while (p&&j<i-1)
{
j++;
p = p->next;
}
if (p==NULL||j>i-1)
{
return false;
}
Node *q = (Node *)malloc(sizeof(Node));
q->data = data;
q->next = p->next;
p->next = q;
return true;
}
bool DeleteByIndex(Node *l, int i) {
Node *p = l->next;
int j = 1;
while (p&&j<i-1)
{
p = p->next;
j++;
}
if (p == NULL || j > i - 1)
{
return false;
}
Node *q = p->next;
p->next = q->next;
free(q);
return true;
}
int GetByIndex(Node *l, int i) {
Node *p = l->next;
int j = 1;
while (p&&j<i-1)
{
j++;
p = p->next;
}
if (p == NULL || j > i - 1)
{
return -1;
}
return p->next->data;
}
bool UpdataByIndex(Node *l, int i, int data) {
Node *p = l->next;
int j = 1;
while (p&&j < i - 1)
{
j++;
p = p->next;
}
if (p == NULL || j > i - 1)
{
return false;
}
p->next->data = data;
return true;
}
bool IsEmpty(Node *l) {
Node *p = l->next;
if (p==NULL)
{
return false;
}
return true;
}
void ClearList(Node *l) {
Node *p = l->next;
if (p==NULL||l==NULL)
{
printf("\n单链表为空\n");
}
else {
Node *q;
while (p)
{
q = p->next;
free(p);
p = q;
}
l->next = NULL;
printf("\n全部清空\n");
}
}
void SortList(Node *l) {
Node *p, *q;
int temp;
for (p = l->next;p!=NULL;p = p->next)
{
for (q = p; q != NULL; q = q->next) {
if (p->data>q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
printf("\n排序后的数据为:\n");
printfList(l);
}
int SearchByData(Node *l, int data) {
Node *p = l->next;
int i = 1;
while (p)
{
if (p->data == data)
{
return i;
}
i++;
p = p->next;
}
return -1;
}
bool DeleteByData(Node *l, int data) {
Node *p = l->next;
int i = 1;
while (p)
{
if (p->data==data)
{
if (DeleteByIndex(l, i))
{
return true;
}
}
i++;
p = p->next;
}
return false;
}
void DeleteList(Node *l, int min, int max) {
Node *p = l;
Node *q = l->next;
while (q)
{
if (q->data<min || q->data>max) {
p->next = q;
p = q;
q = q->next;
}
else {
Node *l1 = q;
q = q->next;
free(l1);
}
}
p->next = NULL;
}
void printfList(Node *l) {
Node *p = l->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}