目录
基本操作
1)初始化
2)求表长
3)按序号查找结点
4)按值查找结点
5)插入结点
6)删除结点
7)建立单链表
完整代码
//单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct LNode
{
int data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
//初始化单链表,建立头结点
bool InitList(LinkList L){
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return true;
}
//采用尾插法建立一个单链表
LinkList List_TailInsert(LinkList &L){
int x;
L=(LNode *)malloc(sizeof(LNode));
LNode *s,*r=L;
printf("请输入你想插入的第一个值(1—10000):");
scanf("%d",&x);
while(x!=9999){
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s;
printf("想插入的下一个值:");
scanf("%d",&x);
}
r->next=NULL;
return L;
}
//求表长操作
int Length(LinkList &L){
int len=0;
LNode *p=L;
while(p->next!=NULL){
p=p->next;
len++;
}
return len;
}
//按序号查找结点
LNode *GetElem(LinkList &L,int i){
LNode *p=L;
int j=0;
while(p!=NULL&&j<i){
p=p->next;
j++;
}
return p;
}
//按值查找结点
LNode *LocateElem(LinkList &L,int e){
LNode *p=L->next;
while(p!=NULL && p->data!=e){
p=p->next;
}
return p;
}
// 输出函数
void print(LinkList L) {
LNode* p = L->next; // 从头节点开始遍历
if (p == NULL) {
printf("链表为空。\n");
} else {
printf("此时单链表中的数据有: ");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
//插入结点,r为插入元素的位置,x为插入元素的值
bool ListInsert(LinkList &L,int r,int x){
int j=0;
LNode *p=L;
while(p!=NULL&&j<r-1){
p=p->next;
j++;
}
if(p==NULL){
return false;
}
//后插操作
LNode *s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=p->next;
p->next=s;
//对某一结点进行前插操作
// int temp;
// s->next=p->next;
// p->next=s;
// temp=p->data;
// p->data=s->data;
// s->data=temp;
return true;
}
//删除结点
//f为删除结点的序号,g为想删除的结点的值
bool ListDelete(LinkList L,int f,int g){
int j=0;
LNode *p=L;
while(p!=NULL&&j<f-1){
p=p->next;
j++;
}
if(p==NULL||p->next==NULL){
return false;
}
LNode *q=p->next;
p->next=q->next;
free(q);
return true;
}
int main(){
LinkList L;
InitList(L);
List_TailInsert(L);
print(L);
Length(L);
int length=Length(L);
printf("该链表的长度为:%d\n",length);
//按序号查找结点
//i为元素的序号,在此处为想要查找元素的序号
int i;
printf("请输入要查找的元素序号:", length - 1);
scanf("%d", &i);
if (i >= 0 && i < length) { // 确保输入的索引有效
LNode *elem = GetElem(L, i);
if (elem != NULL) {
printf("按序号查找到的节点为:%d\n", elem->data);
} else {
printf("没有找到该序号的节点。");
}
} else {
printf("输入的序号无效。");
}
//按值查找结点
int e;
//找到问题了,scanf应该放在printf的后面
//scanf("%d",&e);
printf("请输入你要查找的元素:");
scanf("%d",&e);
LNode* found=LocateElem(L,e);
if(found!=NULL){
printf("此时所查找到的结点的元素:%d\n",found->data);
}else{
printf("未找到该元素。\n");
}
//插入结点
int r;
printf("请输入你想插入的元素的序号:");
scanf("%d",&r);
int x;
printf("请输入你想插入的元素的值:");
scanf("%d",&x);
ListInsert(L,r,x);
print(L);
//删除结点
//f为删除结点的序号,g为想删除的结点的值
int f;
printf("请输入你想删除的元素的序号:");
scanf("%d",&f);
int g;
printf("请输入你想删除的元素的值:");
scanf("%d",&g);
ListDelete(L,f,g);
print(L);
return 0;
}
示例
请输入你想插入的第一个值(1—10000):2
想插入的下一个值:3
想插入的下一个值:4
想插入的下一个值:5
想插入的下一个值:6
想插入的下一个值:9999
此时单链表中的数据有: 2 3 4 5 6
该链表的长度为:5
请输入要查找的元素序号:2
按序号查找到的节点为:3
请输入你要查找的元素:3
此时所查找到的结点的元素:3
请输入你想插入的元素的序号:2
请输入你想插入的元素的值:8
此时单链表中的数据有: 2 8 3 4 5 6
请输入你想删除的元素的序号:4
请输入你想删除的元素的值:4
此时单链表中的数据有: 2 8 3 5 6