用户输入五个元素,OutputLNode函数实现输出,通过CreateList_L函数实现单链表的逆位序建立,GetElem函数查找元素并返回其值,ListInsert_L函数插入需要在单链表中插入的值,Status ListDelete_L函数实现删除定位元素的值,并将它们在主函数中一一实现。
算法流程图:
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
} LNode ,*linklist;
void CreateList_L(linklist &L,int n){
L= (linklist) malloc (sizeof(LNode));
L->next = NULL;
int i;
LNode *p;
for (i=n;i>0;--i)
{
p=(linklist) malloc (sizeof(LNode));
scanf ("%d",&(p->data));
p->next=L->next;L->next=p;
}
}
void OutputLNode(linklist L){
L=L->next;
while (L)
{
printf ("%d ",L->data);
L=L->next;
}
}
Status GetElem(linklist &L,int i,ElemType e){
LNode *p;
int j;
p=L->next;j=1;
while (p&&j<i){
p=p->next;++j;
}
if (!p||j>i)
return ERROR;
e=p->data;
return OK;
}
Status ListInsert_L(linklist &L,int i,ElemType e){
LNode *p;
int j;
LNode *s;
p=L;
j=0;
while(p&&j<i-1){p=p->next;++j;}
if (!p||j>i-1)
return ERROR;
s=(linklist)malloc (sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete_L(linklist &L,int i,ElemType &e){
LNode *p,*q;
int j=0;
p=L;
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;
}
int main()
{
int a,b,c,d;
LNode *L;
scanf ("%d",&b) ;
CreateList_L(L,b);
printf ("表中的元素:");
OutputLNode(L);
ElemType e;
GetElem(L,a,e);
printf ("\n插入位置:");
scanf("%d",&a);
printf("插入数:");
scanf ("%d",&c);
ListInsert_L(L,a,c);
OutputLNode(L);
printf ("\n删除位置:");
scanf("%d",&d);
ListDelete_L(L,d,e);
OutputLNode(L);
system("pause");
return OK;
}
运行结果展示:
这里是不吃香菜也可做香菜头子。