我用的是头插法
#include<stdio.h>
#include<malloc.h>
#define TURE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList ;
//创建链表
void BuildList_L(LinkList &L, int n)
{
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入元素值:");
for (int i = 0 ; i < n; i++ )
{
p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &p->data); //输入元素值
p->next = L->next;
L->next = p; //插入到表头
}
}
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
//在i的带头节点的单链线性表L中的第i个位置之前插入元素e
LinkList p;
LinkList s;
p = L;
int j = 0;
while (p && j < i - 1) //寻找i-1个节点
{
p = p->next;
++j;
}
if (!p || j > i - 1)
return ERROR; //i小于1或者大于表长加1
s = (LinkList)malloc(sizeof(LNode)); //生成新节点
s->data = e; //插入L中
s->next = p->next;
p->next = s;
return OK;
}
//链表的删除
Status ListDelete_L(LinkList &L, int i, ElemType &e)
{
//在带头结点的单链线性表L中。删除第i个元素的。并由e返回其值
LinkList p;
LinkList q;
p = L;
int j = 0;
while (p->next && j < i - 1)
{
p = p->next;
++j;
}
if (!(p->next) || j > i - 1)
return ERROR; //删除节点不合理
//删除并释放节点
q = p->next;
p->next = q->next;
e = q->data;
free(q);
return OK;
}
void PrintfList(LinkList &L)
{
LinkList p ;
p = L->next ;
if (p == NULL)
printf_s("该链表为空\n");
else
{
while (p)
{
printf_s("%d ", p->data);
p = p->next ;
}
}
}
void main()
{
LinkList l;
int a = 0; //a为链表长度
printf_s("请输入所要创建的链表元素的个数:");
scanf_s("%d", &a);
BuildList_L( l , a );
printf_s("输出如今的链表:");
PrintfList( l );
printf_s("\n");
int x = 0, y = 0; //x代表所要插入元素的位置,y为所要插入元素的值
printf_s("输入要 插入的元素的位置及元素的值:");
scanf_s("%d%d", &x , &y );
ListInsert_L( l , x , y );
printf_s("输出如今的链表:");
PrintfList( l );
printf_s("\n");
int m = 0, n = 0; //m代表所要删除元素的位置,n代表所要删除的元素的值
printf_s("输入要删除的元素的位置及元素值:");
scanf_s("%d%d", &m, &n);
ListDelete_L( l , m , n );
printf_s("输出如今的链表:");
PrintfList( l );
printf_s("\n");
}