#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef struct node //定义一个单链表结点类型
{
int data;// 每个结点存放一个数据元素
struct node *next;//指针指向下一个结点
}LNode,*LinkList; //定义一个结点。
//LNode *L(强调指向结点的指针),LinkList L(强调为单链表)
//(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem
//利用头插法逆序建立单链表(逆向插入,此方法有头节点)
LinkList HeadInsert(LinkList &L,int a[],int n)
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));//创建头节点;
L->next = NULL; //c初始化为空链表
for(int i=0;i<n;i++)
{
s = (LNode*)malloc(sizeof(LNode));//创建一个新结点
s->data = a[i];
s->next = L->next; //第一个为null。
L->next=s;
}
return L;
}
//按值查找结点的位序
Status searchElem(LinkList L,int e)
{
LNode *p = L->next;
int i = 1;
while(p != NULL)
{
if(p->data == e)
{
return i;
}
p = p->next;
i++;
}
return false;
}
//按位序查找结点的值
LNode *LocateElem(LinkList L,int i)
{
int j = 1;
LNode *p = L->next;
if(i ==0)
{
return L;
}
if( i<0 )
{
return NULL;
}
while(p != NULL && j<i)
{
p = p->next;
j++;
}
return p;
}
//按位序插入结点操作;
Status ListInsert(LinkList &L,int i,int e)
{
if(i<1)//输入位序是否合法;
{
return false;
}
LNode *p;
p = L->next;
int j=1;
while(p != NULL && j<i-1)//要找到i的前驱结点i-1。
{
p = p->next;
j++;
}
if(p == NULL)//i值不合法
{
return false;
}
LNode *s;//创建一个插入结点
s =(LNode*)malloc(sizeof(LNode));
if(s == NULL)//内存分配失败
{
return false;
}
s->data = e;//插入数据;
s->next = p->next;
p->next = s;//将结点连接到P之后
return true;
}
//按位序上的删除结点
Status DeleteList(LinkList &L,int i)
{
if(i<1)
{
return false;
}
//找到第i-1的结点
LNode *p;
LNode *q;
p = (LNode*)malloc(sizeof(LNode));
p = L->next;
int j=1;
while(p != NULL && j<i-1)
{
p = p->next;
j++;
}
if(p==NULL)
{
return false;
}
//找到i-1个结点的位置。
q = p->next;
p->next = q->next;
free(q);
return true;
}
//遍历输出链表的值
void PrintList(LinkList L)
{
LNode *p;
p = L->next;
int count = 1;
printf("该单链表值为:");
while(p != NULL)
{
printf("%d ",p->data);
p=p->next;
count++;
}
printf("\n");
}
//主函数
int main()
{
LinkList L;//L是指向定义的node结构体的指针
LNode *p;
int n,x,i,e;
int a[100];
printf("请输入数组个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
//测试头插法建立链表;
HeadInsert(L,a,n);
//输出建立后的链表
PrintList(L);
//按值查找;
printf("输入你要查找的数字:");
scanf("%d",&x);
if(searchElem(L,x))
{
printf("找到值为%d的坐标为%d\n",x,searchElem(L,x));
}
else
{
printf("没有找到该数字。\n");
}
//按位序查找
printf("输入你要查找的位序:");
scanf("%d",&i);
p = LocateElem(L,i);
if(p)
{
printf("找到位序%d的值为%d\n",i,p->data);
}
else
{
printf("没有找到。\n");
}
//在某按位序插入结点;
if(ListInsert(L,2,3))
{
printf("插入成功,插入后的顺序表:\n");
PrintList(L);
}
else
{
printf("插入失败,插入位序不合法。\n");
}
if(DeleteList(L,2))
{
printf("删除成功,插入后的顺序表:\n");
PrintList(L);
}
else
{
printf("删除失败,插入位序不合法。\n");
}
}
单链表的基本操作(一)
最新推荐文章于 2024-07-08 21:10:38 发布