链表的插入与删除操作 简单C语言实现完整代码
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
int InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */
if(!(*L)) /* 存储分配失败 */
return 0;
(*L)->next=NULL; /* 指针域为空 */
return 1;
}
int ListInsert(LinkList *L,int i,int e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i) /* 寻找第i个结点 */
{
p = p->next;
++j;
}
if (!p || j > i)
return 0; /* 第i个元素不存在 */
s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return 1;
}
int ListDelete(LinkList *L,int i,int *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) /* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return 0; /* 第i个元素不存在 */
q = p->next;
p->next = q->next; /* 将q的后继赋值给p的后继 */
*e = q->data; /* 将q结点中的数据给e */
free(q); /* 让系统回收此结点,释放内存 */
return 1;
}
int ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
return 1;
}
void main()
{
LinkList L;
int i,j,k,n,e;
i=InitList(&L);
printf("请输入初始化链表的长度\n");
scanf("%d",&n);
printf("请输入初始化链表:");
for(k=1;k<=n;k++)
{
scanf("%d",&j);
i=ListInsert(&L,1,j);
}
printf("在L的表头依次插入初始化链表后:L.data=",n);
ListTraverse(L);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L);
printf("请输入要删除的元素位置\n");
scanf("%d",&j);
ListDelete(&L,j,&e); /* 删除第j个数据 */
printf("删除第%d个的元素值为:%d\n",j,e);
ListTraverse(L);
}
实现效果截图