链表的基本操作

来源:互联网 发布:windows xp 键盘鼠标 编辑:程序博客网 时间:2024/06/03 20:24

一、链表的数据结构
(1)顺序存储

int  link[10];

(2) 链式存储结构

typedef struct LNode{    ElemType data;      struct LNode *next;  }LNode,*LinkList;  //LinkList为结构体类型的指针,可以直接定义变量,比如LinkList p

二、链表的常见的基本操作

(1) 链表的创建

头插法(按照节点的逆序,每插入一个节点都在链表的头部)

 typedef struct Lnode {    ElemTyle date;    struct Lnode*next; }Lnode;Lnode*CreatListFront(){linklist *p,*head;head=(LNode*)malloc(sizeof(LNode));head->next=null;while(1){    scanf("%d",&data);    p->data=data;    p->next=head->next;    head->next=p;}return head;}

尾插法(每插入一个元素,插到链表的尾部)

Lnode *CreateListRear(){    linklist *p;*head;*q;    head=(LNode*)malloc(sizeof(Lnode));    head->next=null;    while(1)    {        scanf("%d",&data);        q=(LNode*)malloc(sizeof(Lnode));        q->data=data;        q->next=p->next;// q->next=null;        p->next=q;//Q的值赋插在P的后面        p=q;//P指向链表链尾的节点    }return head;}

(2)链表的插入

void Insert(Linklist&L,int i,ElemType e){    int j=0;    linklist p;    p=l;    while(p!=null&&j<i-1)//查找第I-1个节点P    {        p=p->next;        ++j;   }   if(!p||j>i-1) return error;        s=(LNode*)malloc(sizeof(Lnode));        s->data=e;        s->next=p->next;        p->next=s;}

**(3)链表的删除

void Delete(Linklist&L,int i){int j=0;linklist p;p=l;while(p!=null&&j < i -1)//查找第I-1个节点P{p=p->next;++j;}if(!p||j > i-1) return error;q=(LNode*)malloc(sizeof(Lnode));q=p->next;p->next=q->next;free(q);}

(3)查找

void FindListElement(Linklist&l, ElemType e){linklist *p=l->next;int i;whils(p->next!=null){if(p->data==e)return i;}p=p->next;i++;}

(4) 插入(在第I个位置之前插入元素e)**

void Insert(Linklist&l, int i,ElemType e){    linklist *p;    s=(LNode*)malloc(sizeof(LNode));    p=l;    int j=0;    while(p!=null&&j<i-1)    {        p=p->next;        j++;    }    if(p==null||j>i-1) return error;    s->data=e;    s->next=p->next;    p->next=s;}

(5)判断单链表是否为空

int LinklistIsEmpty(linklinst&l){    Lnode *p;    p=l;    if(p->next==null)        return 0;    else        return 1;}

(6) 单链表的反向逆置(1,2,3逆置为3,2,1,)
1.三个指针的方法遍历逆转

void Reservelinklist(Node *head){    node*p,q,r;    if(head->next==null||head==null);return error;    p=head;    q=head->next;    head->next=null;//旧的头指针是新的尾指真,所以next为空    while(q)    {        r=q->next;//R先保留下一步要处理的指针        q->next=p;//p q交换指针方向        p=q;        q=r; }    head=p;//最后q必然是指向空的,所以P作为头结点    return head;}

方法2 从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。

Node* ReverseList(Node* head)   {       Node *p,*q;        p=head->next;       while(p->next!=NULL)      //在这个循环过程中p所指的元素一直是不变的      {          q=p->next;           p->next=q->next;           q->next=head->next;           head->next=q;       }       p->next=head;            //相当于成环       head=p->next->next;       //新head变为原head的next       p->next->next=NULL;     //断掉环       return head;     }  

(7)**链表的遍历
反向遍历单链表**

void f(LNode *l){    if(l->next==null)    {        cont<<l->data;    }    else    {        f(l->next);        cont<<l->data;   }}
0 0
原创粉丝点击