链表与顺序表不同,它是一种动态的存储结构,链表中每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的。读入数据元素的顺序和生成的链表中元素的顺序是相反的,因此运行结果是倒序输出。
#include<stdio.h>
#include<stdlib.h>
typedef struct lnode
{
int data;
struct lnode *next;
}LNode,*List;
List init_list(); //函数声明
LNode *get_list(List L,int i);
int insert_list(List L,int i,int x) ;
int delete_list(List L,int i);
void print_list(List L);
int main()
{
List L;
int place,x,choice,flag;
L=(List)malloc(sizeof(List));
printf("输入原来的单链表ª\n");
L=init_list();
printf("选择插入和删除\n");
scanf("%d",&choice);
switch(choice)
{
case 1:{printf("输入插入的结点和元素\n");
scanf("%d%d",&place,&x);
flag=insert_list( L,place,x);
if(flag) print_list(L);break;}
case 2:{printf("输入删除的结点:êo\n");
scanf("%d",&place);
flag=delete_list(L,place);
if(flag) print_list(L);break;}
default:printf("发生错误");
}
return 0;
}
List init_list() //在表头插入,建立线性表的链式存储
{
List L=NULL;
LNode *s;
int x,flag=-1;
scanf("%d",&x);
while(x!=flag)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L;
L=s;
scanf("%d",&x);
}
return L;
}
LNode *get_list(List L,int i) //查找,按序号查找
{
LNode *p=L;
int j=0;
while(p->next!=NULL&&j<i)
{p=p->next;j++;}
if(j==i)return p;
else return NULL;
}
int insert_list(List L,int i,int x) //插入运算
{
LNode *p,*s;
p=get_list(L,i-1); //查找第i-1个结点
if(p==NULL)
{printf("参数错误\n");return 0;} //第i-1个结点不存在不能插入
else
{
s=(LNode*)malloc(sizeof(LNode)); //申请、填装结点
s->data=x;
s->next=p->next; //新结点插入在第i-1个结点的后面
p->next=s;
return 1;
}
}
int delete_list(List L,int i) //删除运算
{
List p,s;
p=get_list(L,i-1); //查找第i-1个结点
if(p==NULL)
{
printf("第i-1个结点不存在²\n");
return -1;
}
else if(p->next==NULL)
{
printf("第i个结点不存在\n");
return 0;
}
else
{
s=p->next; //s指向第i个结点
p->next=s->next; //从链表中删除
free(s); //释放*s
return 1;
}
}
void print_list(List L) //输出函数
{
List p=L;
while(p)
{
printf("%d\t",p->data);
p=p->next;
}
printf("\n");
}