/*单链表的基本操作*/
#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
struct Lnode
{
int data ;
struct Lnode *next;
}Lnode;
typedef struct Lnode *link_list;
typedef int elemType;
/*下面函数是从链表L中求取第i个结点存储的数据,并把它的值赋给e*/
int get_elem(link_list L,int i,elemType &e)
{
link_list 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 0;
}
/*下面函数是在已知链表的第i处插入一个元素结点,结点值是e*/
int list_insert(link_list &L,int i,elemType e)
{
link_list p,s;
p = L;
elemType j = 0;
///*
while(p && j < i-1)
{
p = p->next;
++j;
}
s = (link_list)malloc(sizeof(Lnode));
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
/*下面的函数是从一个已经存在的链表中删除第i个结点,并把结点的值赋给e*/
int delete_list(link_list &L,int i,elemType e)
{
link_list p;
int j = 0;
p = L;
while(p&&j < i-1)
{
p = p->next;
++j;
}
if(!p || j > i-1)
return ERROR;
e = p->next->data;
p->next = (p->next)->next;
return e;
}
/*下面的函数是链表的倒置*/
int reverse_list(link_list &L)
{
link_list p = L,q = L->next;
while(q != NULL)
{
L->next = q->next;
q->next = p;
if(q->next == L)
{
q->next==NULL;
}
p = q;
q = L->next;
}
L->next = p;
return OK;
}
void main()
{
link_list L,L1,L2,L3;
L = (link_list)malloc(sizeof(Lnode));
L1 = (link_list)malloc(sizeof(Lnode));
L2 = (link_list)malloc(sizeof(Lnode));
L3 = (link_list)malloc(sizeof(Lnode));
int e;
L->next = L1;
L1->next = L2;
L2->next = L3;
L3->next = NULL;
L->data = 0;
L1->data = 10;
L2->data = 20;
L3->data = 30;
get_elem(L,3,e);
//printf("e = %d/n",e);
list_insert(L,4,40);
//printf("%d/n",((L->next)->next->next->next)->data);
//int m;
//m = delete_list(L,3,e);
//printf("%d/n",m);
//printf("%d",L->next->next->next->data);
reverse_list(L);
// printf("%d",L->data);
printf("%d/n",L->next->data);
printf("%d/n",(L->next)->next->data);
printf("%d/n",L->next->next->next->data);
printf("%d/n",L->next->next->next->next->data);
}