目录
1.定义结构体
typedef struct node { char data; struct node* next; }Lnode;
2. 初始化创建链表
Lnode* CreatLinkList()//创建链表 { char x;//链表输入值 Lnode* head, * p, * q;//定义头指针,两个暂存指针 head = (Lnode*)malloc(sizeof(Lnode)); head->next = NULL; q = head;//q开始时指向head printf("请输入单链表的值:"); scanf_s("%c", &x); while (x != '\n') { p = (Lnode*)malloc(sizeof(Lnode)); p->data = x; p->next = NULL; q->next = p; q = p; scanf_s("%c", &x); } return head; }
对于单链表的结构体定义和初始化创建单链表我上一篇博客已经介绍过。此处用的是尾插法,不在进行详细的阐述。
3.求链表长度
int Length_LinkList(Lnode* head)//求链表长度 { Lnode* p = head; int i=0; while (p->next != NULL) { p = p->next; i++; } return i; }
对于求一个链表的长度,我们只需要对链表进行遍历。令暂存指针 p=head,使其进行后移操作,用 i 进行计数 ,直到p->next为空(也就是后面没有元素为止)。
4.查找链表中第i个节点
Lnode* Get_LinkList(Lnode* head, int i)//查找链表中第i个节点 { Lnode* p = head; int j = 0; while (p!=NULL && j<i) { p = p->next; j++; } return p; }
对于查找链表中第 i 个节点,我们采取的方法是对指针进行后移 i 次。令暂存指针 p=head,使其进行后移操作,用 j 进行计数 ,直到 p=NULL 或 j = i 的时候,我们将指针p作为返回值返回。
5.判断元素x是否存在
void Locate_LinkList(Lnode* head, char x)//查找元素x是否存在 { int i=1; Lnode* p = head->next; while (p!= NULL && p->data != x) { p = p->next; i++; } if (i == Length_LinkList(head)+1) { printf("未找到元素\n"); } else { printf("%d",i); } }
对于判断元素x是否存在 ,我们只需采用相同的方法对链表进行遍历,如果p->data=x则输出元素x的下表 i 。如果 x 不在链表中则while循环会因为p==NULL而终止,i=表长+1。所以当i == Length_LinkList(head)+1 时,输出“未找到元素”。
6.插入
void Insert_LinkList(Lnode* head, int i, char x)//插入 { Lnode* p = head, * s; p = Get_LinkList(head,i-1); if (p == NULL) { printf("插入位置错误!"); } else { s = (Lnode*)malloc(sizeof(Lnode)); s->data = x; s->next = p->next; p->next = s; } }
对于插入操作,我们调用 Get_LinkList 函数来将暂存指针定位到第 i-1 的位置,然后用尾插法进行插入。
7.删除
void Del_LinkList(Lnode* head, int i)//删除 { Lnode* p, * q; p = Get_LinkList(head, i - 1); if (p == NULL) { printf("删除位置错误\n"); } else { if (p->next == NULL) { printf("第i个节点不存在\n"); } else { q = p->next; p->next = q->next;//为了防止单链表断链 free(q); } } }
对于删除操作,我们同样调用 Get_LinkList 函数来将暂存指针定位到第 i-1 的位置,然后判断p是否为空。如果不为空,我们判断 i-1 是否为最后一个节点。如果不是则对第 i 个节点进行删除。
8.打印
void print(Lnode* h)//打印链表 { Lnode* p; p = h->next; while (p != NULL) { printf("%c", p->data); p = p->next; } printf("\n"); }
此处对打印操作不做解释,详情见上一篇博客。
9.源代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
char data;
struct node* next;
}Lnode;
Lnode* CreatLinkList()//创建链表
{
char x;//链表输入值
Lnode* head, * p, * q;//定义头指针,两个暂存指针
head = (Lnode*)malloc(sizeof(Lnode));
head->next = NULL;
q = head;//q开始时指向head
printf("请输入单链表的值:");
scanf_s("%c", &x);
while (x != '\n')
{
p = (Lnode*)malloc(sizeof(Lnode));
p->data = x;
p->next = NULL;
q->next = p;
q = p;
scanf_s("%c", &x);
}
return head;
}
void print(Lnode* h)//打印链表
{
Lnode* p;
p = h->next;
while (p != NULL)
{
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
int Length_LinkList(Lnode* head)//求链表长度
{
Lnode* p = head;
int i=0;
while (p->next != NULL)
{
p = p->next;
i++;
}
return i;
}
Lnode* Get_LinkList(Lnode* head, int i)//查找链表中第i个节点
{
Lnode* p = head;
int j = 0;
while (p!=NULL && j<i)
{
p = p->next;
j++;
}
return p;
}
void Locate_LinkList(Lnode* head, char x)//查找元素x是否存在
{
int i=1;
Lnode* p = head->next;
while (p!= NULL && p->data != x)
{
p = p->next;
i++;
}
if (i == Length_LinkList(head)+1)
{
printf("未找到元素\n");
}
else
{
printf("%d",i);
}
}
void Insert_LinkList(Lnode* head, int i, char x)//插入
{
Lnode* p = head, * s;
p = Get_LinkList(head,i-1);
if (p == NULL)
{
printf("插入位置错误!");
}
else
{
s = (Lnode*)malloc(sizeof(Lnode));
s->data = x;
s->next = p->next;
p->next = s;
}
}
void Del_LinkList(Lnode* head, int i)//删除
{
Lnode* p, * q;
p = Get_LinkList(head, i - 1);
if (p == NULL)
{
printf("删除位置错误\n");
}
else
{
if (p->next == NULL)
{
printf("第i个节点不存在\n");
}
else
{
q = p->next;
p->next = q->next;
free(q);
}
}
}
int main()
{
Lnode* h, * p;
int i;
char x;
h = CreatLinkList();
print(h);
i = Length_LinkList(h);
printf("链表的长度为:%d\n", i);
printf("请输入要查找元素的序号:\n");
scanf_s("%d", &i);
p = Get_LinkList(h, i);
if (p != NULL)
{
printf("%c", p->data);
}
else
{
printf("未找到元素");
}
printf("请输入要查找元素的值:");
getchar();
scanf_s("%c", &x);
Locate_LinkList(h, x);
printf("请输入要插入的元素位置i和值x:");
scanf_s("%d %c", &i, &x);
Insert_LinkList(h, i, x);
print(h);
printf("请输入要删除的位置i");
scanf_s("%d", &i);
Del_LinkList(h, i);
print(h);
return 0;
}
10.执行结果