#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int ElemType; //定义数据类型
typedef struct node
{
ElemType data; //数据域
struct node * next; //指针域
}slink; //单链表类型名
slink *creslink(int n) //创建带头结点的单链表
{
slink *head,*p,*s;//创建头结点
int i;
p=head=(slink *)malloc(sizeof (slink));
for(i=1;i<=n;i++)
{
s=(slink *)malloc(sizeof(slink));//申请空间
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL; //尾结点的指针一定要置空
return head;
}
int getlen(slink *head) //获取表长
{
slink * p;
int n=0;
p=head->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return n;
}
int getelem(slink *head,int i,ElemType * e)//取元素操作
{
slink *p;
int j;
if(i<1) //参数1,不合法,返回0
return 0;
p=head->next;
j=1;
while(p!=NULL&&j<i) //从第1个头结点开始查找
{
p=p->next;
j++;
}
if(p==NULL)
return 0;
* e=p->data;
return 1;
}
slink * locate(slink * head,ElemType x) //定位操作
{
int i;
slink *p;
p=head->next;
i=1;
while(p!=NULL&&p->data!=x)
{
p=p->next;
i++;
}
return p;
}
int delete(slink * head,int x) //删除操作
{
slink *p,*q;
p=head;
while(p->next!=NULL&&x!=p->next->data)
{
p=p->next;
}
if(p->next==NULL)
return 0;
q=p->next; //q指向第i个结点
p->next=q->next; //p的指针与指向结点q指向结点的下一个结点,删除第i个结点
free(q);
return 1;
}
int insert(slink * head,int i,ElemType x)
{
slink *p,*q;
int j;
if(i<1)
return 0;
p=head;
j=0;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p==NULL)
return 0;
q=(slink *)malloc(sizeof(slink));
q->data=x;
q->next=p->next;
p->next=q;
return 1;
}
void Print(slink *head) //打印单链表
{
slink *p;
p=head->next;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
slink *head;
ElemType *e;
head=creslink(10);
Print(head);
delete(head,4);
Print(head);
return 0;
}