数据结构--链表操作

/**
 * 2020 3/5
 * 链表
 */
#include<iostream>
using namespace std;
typedef int ElemType;
/**
 * 单链表
 */
typedef struct LNode{
    ElemType data;
    LNode *next;
}LNode,*LinkedList;
/**
 * 链表输出
 * @param L
 */
void print(LinkedList L){
    LNode *p=L->next;
    while(p!=NULL){
        cout<<p->data<<" ";
        p=p->next;
    }
}
/**
 * 头插法建立单链表
 * @param L
 * @return
 */
LinkedList List_InsertHead(LinkedList &L){
    LNode *temp;
    int data;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    cin>>data;
    while(data!=9999){
        temp=(LNode*)malloc(sizeof(LNode));
        temp->data=data;
        temp->next=L->next;
        L->next=temp;
        cin>>data;
    }
    return L;
}
/**
 * 尾插法建立链表
 * @param L
 * @return
 */
LinkedList List_TailInsert(LinkedList &L){
    int data;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    LNode *p=L,*q;
    cin>>data;
    while(data!=9999){
        q=(LNode*)malloc(sizeof(LNode));
        q->data=data;
        p->next=q;
        p=q;
        cin>>data;
    }
    p->next=NULL;
    return L;
}
/**
 * 按位序查找
 * @param L
 * @param i
 * @return
 */
LNode *GetElem(LinkedList L,int i){
    LNode *p=L->next;
    int j=1;
    if(i==0){
        return L;
    }
    if(i<1){
        return NULL;
    }
    while(p&&j<i){
        p=p->next;
        j++;
    }
    return p;
}
LNode *LocateElem(LinkedList L,ElemType e){
    LNode *p=L->next;
    while(p&&p->data!=e){
        p=p->next;
    }
    return p;
}
/**
 * 节点插入
 * @param L
 * @param i
 * @param data
 */
void InsertNode(LinkedList L,int i,int data){
    LNode *p=GetElem(L,i-1);
    LNode *temp=(LNode*)malloc(sizeof(LNode));
    temp->data=data;
    temp->next=p->next;
    p->next=temp;
}
/**
 * 节点前插
 * @param L
 * @param i
 * @param data
 */
void InsertNode_Pre(LinkedList L,int i,int data){
    LNode *p=GetElem(L,i);
    LNode *temp=(LNode*)malloc(sizeof(LNode));
    temp->next=p->next;
    p->next=temp;
    temp->data=p->data;
    p->data=data;
}
/**
 * 删除操作
 * @param L
 * @param i
 */
void DeleteLNode(LinkedList L,int i){
    LNode *p=GetElem(L,i-1);
    LNode *q=p->next;
    if(p->next==NULL){
        return;
    }
    p->next=q->next;
    free(q);
}
/**
 * 删除指定节点
 * @param L
 * @param i
 */
void DeleteLNode(LinkedList L,LNode *node){
    LNode *temp=L->next;
    for(;node->data!=temp->data&&node->next!=temp->next;temp=temp->next);
    LNode *p=temp->next;
    int value=node->data;
    node->data=p->data;
    p->data=value;
    node->next=p->next;
    free(p);
}
int main(){
    LinkedList list;
    List_TailInsert(list);
    DeleteLNode(list,GetElem(list,2));
    print(list);
    return 0;
}
上一篇:数据结构实验之链表六:有序链表的建立


下一篇:C++线性表和链表