C语言:单链表的增删减除、查找、计算长度
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct Node
{
ElemType date;
struct Node *next;
}Node,*ListLink;
// 链表初始化
ListLink Link_(ListLink *L)
{
*L=(ListLink)malloc(sizeof(Node));
(*L)->next=NULL;
}
// 利用头插法建立链表
int greate(ListLink L)
{
Node *s;
char c;
printf("请输入一串数字");
while(1)
{
scanf("%d",&c);
if(c==-1) return NULL;
s=(ListLink)malloc(sizeof(Node));
s->date=c;
s->next=L->next;
L->next=s;
}
}
// 查找单链表中的第 i 个节点
ListLink get(ListLink L,int i)
{
int j;
Node *p;
if(i<=0) return NULL;
p=L;j=0;
while((p->next!=NULL)&&(j<i))
{
p=p->next;
j++;
}
if(i==j)
printf("查找节点的值:%d ",p) ;
return p;
}
// 查找单链表值为 key 的节点
ListLink Zget(ListLink L,ElemType e)
{
Node *p;
int j;
p=L->next;
while(p!=NULL)
{
if(p->date!=e)
{
p=p->next;
}
else break;
}
return p;
printf("查找的节点位置为:%d",p);
}
// 求单链表的长度
int Length(ListLink L)
{
Node *p;
p=L->next;
int j=0;
while(p!=NULL)
{
p=p->next;
j++;
}
printf("该单链表的长度为:%d",j);
return j;
}
// 单链表中的插入操作
void IntList(ListLink L,int i,ElemType e)
// 在第 i 个位置插入新节点 e
{
Node *p,*r;
int k;
if(i<=0)
{
printf("操作不合理");
}
p=L;
k=0;
while(p!=NULL&&k<i-1)
{
p=p->next;
k=k+1;
}
if(p==NULL)
{
printf("操作不合理");
}
r=(Node *)malloc(sizeof(Node));
r->date=e;
r->next=p->next;
p->next=r;
printf("添加后的链表:");
}
// 单链表的删除操作
void delList(ListLink L,int i,ElemType e)
{
Node *p,*r;
int k;p=L;k=0;
while(p->next!=NULL&&k<i-1)
{
p=p->next;
k=k+1;
}
if(p->next==NULL)
{
printf("删除节点不合理");
}
r=(Node *)malloc(sizeof(Node));
r=p->next;
p->next=r->next;
e=r->date;
free(r);
printf("删除后的链表:");
}
// 输出链表
void Output(ListLink L)//输出链表的各个元素
{
int i;
for( i = 0; L->next!=NULL;i++)
{
printf("%d ",L->next->date);
L=L->next;
}
printf("\n");
}
int main()
{
ListLink L;
int c,i,j;
int d,z;
Link_(&L);
greate(L);
printf("输入的链表为:");
Output(L);
printf("请输入插入的位置和大小");
scanf("%d,%d",&i,&d);
IntList(L,i,d);
Output(L);
printf("请输入删除的位置和大小");
scanf("%d,%d",&j,&z);
delList(L,j,z);
Output(L);
Length( L);
printf("请选择查找方式:1、按地址查找 2、按值查找");
scanf("%d",&c);
switch(c)
{
int i,j;
case 1:
printf("请输入查找的节点");
scanf("%d",&i);
get(L,i);
break;
case 2:
printf("请输入查找的值");
scanf("%d",&j);
Zget(L,j);
break;
}
}