#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));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
//头插法建立一个单链表
LinkList HeadInsert (LinkList& L,int n) {
int x;
LNode *p;
for(int i = 0 ; i<n ; i++) {
p = (LNode*)malloc(sizeof(LNode));
printf("请输入您要插入的第%d个节点:\n",i+1);
scanf("%d",&x);
p->data = x;
p->next =L->next;
L->next = p;
}
return L;
}
//尾插法建立单链表
LinkList TailInsert(LinkList L,int n) {
LNode *p,*r=L; //指针r恒指向链表最后一个节点
int x;
for(int i = 0 ; i<len ; i++) {
p = (LNode*)malloc(sizeof(LNode));
printf("请输入您要插入的第%d个节点:\n",i+1);
scanf("%d",&x);
p->data = x;
r->next = p;
r = p;
}
r->next = NULL; //插入完成后r的next必须置空
return L;
}
//按位查找
LNode *GetElem(LinkList L,int i) {
if (i<0)
return NULL;
int j = 0;
LNode *p;
p = L;
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 PrintList(LinkList L) {
L = L->next;
while(L!= NULL) {
printf("%3d",L->data );
L = L->next;
}
printf("\n");
}
//按位序插入节点
bool ListInsert(LinkList L , int i , int e) {
LNode *p,*s;
p = (LNode*)malloc(sizeof(LNode));
if (p==NULL)
return false;
s = GetElem(L,i-1);
p->data = e;
p->next = s->next;
s->next = p;
return true;
}
//按位序删除节点
bool ListDelete(LinkList L , int i , int *m) {
LNode *p,*s;
p = (LNode*)malloc(sizeof(LNode));
if (p==NULL)
return false;
s = GetElem(L,i-1);
LNode *q;
q = s->next;
*m = q->data;
s->next = q->next;
free(q);
return true;
}
//指定节点后插
bool InsertNextNode(LNode *p,int e) {
if (p == NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->next = p->next ;
s->data = e;
p->next = s;
return true;
}
//指定节点前插
bool InesrtPriorNode(LNode *p,int e) {
if (p == NULL)
return false;
LNode *s = (LNode*)malloc(sizeof(LNode));
if (s == NULL)
return false;
s->next = p->next ;
p->next = s;
s->data = p->data ;
p->data = e;
return true;
}
//指定节点删除
bool DeleteNode(LNode *p)
{
LNode *q = +p->next ;
p->data = q->data ; //q为p的下一个节点 p的data等于q p的next=q相当去p的下一个节点把p覆盖了
p->next = q->next ;
free(q);
return true;
}
//表长
int Length(LinkList L)
{
int len = 0;
LNode *p;
p = L;
while(p->next !=NULL)
{
p = p->next ;
len++;
}
return len;
}
int main() {
int i,n,z,e,cha,zhi;
int m;
LinkList L; //L是头指针
LNode *E,*C;
if (InitList(L))
printf("带头节点链表初始化成功!\n");
else
printf("带头结点链表初始化失败!\n");
printf("请输入您要插入的节点数:"); //头指针建立单链表逆序输出1 2 3 输出则为3 2 1
scanf("%d",&n);
HeadInsert (L,n);
//TailInsert(L);
PrintList(L);
printf("请输入您要查找第几位元素:\n");
scanf("%d",&i);
C = GetElem(L,i);
if (C!=NULL) {
printf("按位查找成功!\n");
printf("值为:%d\n",C->data);
}
printf("请输入您要查找的元素值:\n");
scanf("%d",&e);
E = LocateElem(L,e);
if(E!=NULL) {
printf("按值查找成功!\n");
printf("值为:%d",E->data);
}
printf("请输入您要在第几个位置插入:\n");
scanf("%d",&cha);
printf("请输入您要在插入的元素值:\n");
scanf("%d",&zhi);
if(ListInsert(L,cha,zhi))
printf("插入成功!\n");
PrintList(L);
printf("请输入您要在第几个位置删除:\n");
scanf("%d",&cha);
if(ListDelete(L,cha,&m)) {
printf("删除成功!\n");
printf("删除元素的值为:%d\n",m);
}
PrintList(L);
return 0;
}
单链表(C语言)完善版
最新推荐文章于 2024-08-24 12:03:35 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)