/*单链表
建立:头插法 尾插法
查找:按序号 按数值
插入运算
删除运算
求表长
逆置
*/
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define flag -1
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}LNode,*LinkList; //LNode 定义结点类型 LinkList指向LNode类型结点的指针类型 即LinkList 等同于LNode *
//建立单链表 头插入法
void CreatHead(LinkList L)
{
LNode *s; //定义指向当前插入元素的指针 等价于 LinkList s
DataType x;
printf("please input data:\n");
scanf("%d",&x);
while(x!=flag)
{
s=(LinkList)malloc(sizeof(LNode));//为当前元素的指针分配地址空间
s->data =x;
s->next =L->next ;
L->next =s;
scanf("%d",&x);
}
}
void Show(LinkList L)
{
LinkList temp=L->next;
if(L == NULL)
printf("List is not exist\n");
printf("List is:\n");
while(temp != NULL)
{
printf("%d \n",temp->data);
temp = temp->next;
}
}
void CreatTail(LinkList L)//尾插法
{
LNode *r,*s;
DataType x;
printf("please input data: end(-1)\n");
scanf("%d",&x);
r=L;
while(x!=flag)
{
s=(LinkList)malloc(sizeof(LNode));
s->data =x;
r->next =s;
r=s;
scanf("%d",&x);
}
r->next =NULL;
}
LNode* GetLinkList(LinkList L,int i)//按序号查找
{
LNode *p;
int j;
p=L;
j=0;
while(p!=NULL&&j<i)
{
p=p->next ;
j++;
}
return p;
}
LNode * LocationLinkList(LinkList L,DataType x)//按置查找
{
LNode *p;
p=L->next ;
while(p!=NULL&&p->data !=x)
p=p->next;
return p;
}
void Insert(LinkList L,int i,DataType x)//插入运算
{
LNode *p,*s;
p=GetLinkList(L,i-1);
{
if(p==NULL)
printf("error!");
else
{
s=(LinkList)malloc(sizeof(LNode));
s->data =x;
s->next =p->next ;
p->next =s;
}
}
}
void Delete(LinkList L,int i)//删除结点
{
LNode *p,*q;
p=GetLinkList(L,i-1);
{
if(p==NULL)
printf("error!");
else
{
q=p->next ;
p->next =p->next->next ;
free(q);
}
}
}
int LengthLinkList(LinkList L)//求表长
{
int len;
LNode *p;
p=L;
len=0;
while(p->next )
{
len++;
p=p->next ;
}
return len;
}
void Reverse(LinkList L)
{
LNode *p,*q;
p=L->next ;
L->next =NULL;
while(p)
{
q=p;
p=p->next ;
q->next =L->next ;
L->next =q;
}
}
int main()
{
LinkList L;
int i,j,a;
DataType x,y;
LNode *p,*q;
L=(LinkList)malloc(sizeof(LNode));
L->next =NULL;
CreatTail(L);
// CreatHead(L);
Show(L);
printf("which number dou you want to find:\n");
scanf("%d",&i);
p=GetLinkList(L,i);
printf("the number is %d\n",p->data );
// printf("which location dou you want to find:\n");
// q=LocationLinkList(L,j);
// printf("the number is %d\n",q->data );
printf("please input what do you want:\n");
scanf("%d",&a);
printf("please input where do you want:\n");
scanf("%d",&x);
Insert(L,a,x);
Show(L);
printf("please delete where do you want:\n");
scanf("%d",&y);
Delete(L,y);
Show(L);
LengthLinkList(L);
Reverse(L);
}
单链表的基本操作 【C语言】
最新推荐文章于 2024-06-25 07:11:52 发布