链表的一些基本操作

来源:互联网 发布:本地阅读软件有声 编辑:程序博客网 时间:2024/04/28 01:22

/*单链表的基本操作*/
#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);
}