/* Note:Your choice is C IDE */
#include "stdio.h"
#include<malloc.h>
#define LEN sizeof(slink)
typedef struct node
{
int data;
struct node *next;
}slink;
slink *creat(int n)
{
slink *head,*p,*s;
int i;
if(n<1)return NULL;
p=head=(slink *)malloc(LEN);
//同时为指针开创一个存储空间
for(i=1;i<=n;i++)
{
s=(slink *)malloc(LEN);
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL;
return head;
}
void print(slink *head)
{
slink *p;
p=head->next;
while(p)
{
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}
int getlen(slink *head)
//求表长
{
slink *p;
int n;
p=head->next;n=0;
while(p)
{ n++;p=p->next; }
return n;
}
slink *del(slink *head,int i)
{
slink *p,*q;
int j;
if(i<1)return 0;
p=head;j=0;
while(p->next!=NULL&&j<i-1)
//删除和增加指向都一样,只是判断的指向不同
{ p=p->next;j++; }
if(p->next==NULL)return 0;
q=p->next;
p->next=q->next;
free(q);
return head;
}
slink *insert(slink *head,int i,int x)
//插入到第i个结点之前
{
slink *p,*q;
int j;
if(i<1)return 0;
p=head;j=0;
while(p&&j<i-1)
{ p=p->next;j++; }
//从第一个结点开始查找第i-1个结点,数据域
if(!p)return 0;
//i结点为空,返回零值,进行下面的语句
q=(slink *)malloc(LEN);
q->data=x;
q->next=p->next;
p->next=q;
return head;
}
void main()
{
slink *head;
int n,i1,i2,x;
scanf("%d",&n);
head=creat(n);
printf("输出链表的数据:");
print(head);
printf("表的长度:");
printf("%d\n",getlen(head));
printf("请输入要删除数的位置:");
scanf("%d",&i1);
head=del(head,i1);
print(head);
printf("请输入要插入的位置和数据:");
scanf("%d%d",&i2,&x);
head=insert(head,i2,x);
print(head);
}