考研复习(2)链表操作

来源:互联网 发布:udid定制源码 编辑:程序博客网 时间:2024/06/05 03:56
1.链表最好采用带头节点的逻辑结构,在删除等操作上比较方便,头节点便是0号节点;
2.在主函数之后定义的函数须在主函数之前申明;
3.要改变链表结构,续传递指向头节点指针的指针;
4.不能直接搬数据结构上的伪代码(严玮文版),还是要自己思考,最好能够画图;
5.调试时出现死循环的话,在终端键入:ps aux
查看死循环进程的pid,然后键入: kill -9 进程的pid 就能终止进程了.
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;


}Lnode,*LinkList;
int ListInsert(LinkList *L, int i,ElemType e);//插入元素
int ListDel(LinkList *L, int i);//删除元素
ElemType GetElem(LinkList L,int i);//获得第i个节点
void del(LinkList *L,int mink,int maxk);//删除区间节点
void inverse(LinkList *L);//逆置链表
int main()
{


     LinkList Q;
initLink(&Q);
ListInsert(&Q,1,'f');
ListInsert(&Q,1,'e');
ListInsert(&Q,1,'d');
ListInsert(&Q,1,'c');
     ListInsert(&Q,1,'a');
     display(Q);
     del(&Q,98,100);
     display(Q);
     inverse(&Q);
     printf("After invert\n");
     display(Q);
     ListDel(&Q,1);
     display(Q);
     printf("The No.2 Element is:%c",GetElem(Q,2));
     return 1;
}
void initLink(LinkList *L)//Only transport the address can change the Link
{
     *L=(LinkList)malloc(sizeof(Lnode));
     (*L)->next=NULL;


}


ElemType GetElem(LinkList L,int i)
{
     Lnode *p=L->next;
     int j=1;
     while(p&&j<i)
     {
          p=p->next;
          ++j;
     }
     if(!p||j>i) return 0;
     return p->data;
}


void display(LinkList L)
{
     Lnode *p=L->next;
if(p==NULL) printf("No element~\n");
else
{
while(p)
{
printf("%5c->",p->data);
p=p->next;
}
}
printf("\n");
}
int ListInsert(LinkList *L, int i,ElemType e)
{
      Lnode *p=*L;//p point to the first node
      int j=0;
      Lnode *s;
      while(p&&j<i-1)//search the No.(i-1) node
      {
           p=p->next;
           j++;


      }
      if(!p||j>i-1) return 0;    //i<1 or >ListLenth+1
      s=(LinkList)malloc(sizeof(Lnode));
      s->data=e;
      s->next=p->next;
      p->next=s;
      return 1;
}
int ListDel(LinkList *L, int i)
{
     Lnode *p=*L;
     Lnode *pre=p;
     int j=0;
     while(p&&j<i)//search the No.i node
      {
           printf("ALALLA");
           pre=p;
           p=p->next;
           j++;
      }
      if(!p||j>i) return 0;    //i<1 or >ListLenth+1
      pre->next=p->next;
}
//delete the element in the sorted linklist that value between mink and maxk


void del(LinkList *L,int mink,int maxk)
{
     Lnode *p=*L;
     Lnode *pre;
     Lnode *q,*s;
     while(p&&p->data<mink)
     {
          pre=p;p=p->next;
          printf("address of p:%d",p);
     }
     if(p)
     {while(p&&p->data<maxk) p=p->next;}


     pre->next=p;


     /*free the memory
     q=pre->next;
     while(q!=p)
     {
          s=q->next;free(q);q=s;
     }*/
}
//avert a linklist
void inverse(LinkList *L)
{
     Lnode *p=*L;
     Lnode *s;
     p=p->next;//move a element
     (*L)->next=NULL;
     while(p)
     {
          //insert at front
          s=p->next;
          p->next=(*L)->next;
          (*L)->next=p;
          p=s;


     }
}
原创粉丝点击