【數據結構】單鏈表的實現和基本操做

單鏈表是不一樣於順序表的另外一種線性結構,每個結點包含了數據域和指針域,可經過每一結點的指針域直接訪問下一個結點,顧名思義,是一種鏈式結構。
本次實現的功能包括:c++

  1. 構建空表
  2. 插入元素
  3. 刪除元素
  4. 查找元素
  5. 交換相鄰元素
#include<stdio.h>
#include<stdlib.h>
#include "malloc.h" 

#define TRUE         1
#define FALSE        0
#define OK           1
#define ERROR        0
#define INFEASIBLE   -1
#define OVERFLOW     -2

typedef int Status;
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,* Linklist; 

Status InitList(Linklist &L){
    //構造空表
    L = (Linklist)malloc(sizeof(LNode));
    L->data = NULL;
    L->next = NULL;
}     
Status ListInsert_L(Linklist &L,int i){
    //在帶頭結點的單鏈線性表L中第i個位置插入鍵盤輸入的數
    int e,j = 0;
    scanf("%d",&e);
    Linklist p;
    p = L; 
    while(p && j < i-1){p = p->next; ++j;} //找到鏈表中第i-1個元素
    if(!p || j>i-1)return ERROR;
    Linklist s = (Linklist)malloc(sizeof(LNode));
    s->data = e;s->next = p->next;
    p->next = s;
    return OK; 
}
Status Elem_search(Linklist L){
    //查找鏈表中指定元素
    printf("您要查找哪一個位置的數\n");
    int i,j = 0;
    Linklist p = L;
    scanf("%d",&i);
    while(p && j < i) {p = p->next;++j;} //找到鏈表中第i個元素
    if(!p || j > i)return ERROR;
    printf("您查找的數是:%d\n",p->data);
    return OK;
}
Status List_print(Linklist L){
    //打印鏈表
    Linklist p;
    p = L;
    printf("現有的單鏈表爲:\n");
    p = p->next;
    while(p->next != NULL) {printf("%d ",p->data);p = p->next;}
    printf("%d ",p->data);
    printf("\n");
    return OK;
}
Status ListDelete_L(Linklist &L){
    //刪除指定元素,並輸出
    printf("請輸入要刪除元素的位置:\n");
    int i;
    scanf("%d",&i);
    Linklist p = L;
    int j = 0;
    while(p->next && j<i-1){p = p->next;++j;} //找到鏈表中第i-1個元素
    if(!(p->next)||j>i-1)return ERROR; //保證鏈表有第i個元素
    Linklist q = p->next;
    p->next = q->next;
    printf("%d被刪除了\n",q->data);
    free(q); 
    return OK;
}
Status List_exchange(Linklist &L){
    //交換指定元素與他後面一個元素的值
    printf("請輸入要交換元素的位置:\n");
    int a,b,j = 0;
    scanf("%d",&a);
    Linklist p = L;
    while(p && j<a){p = p->next;++j;} //找到鏈表第a個元素
    if(!(p->next)||j>a)return ERROR; //保證鏈表有第a+1個元素
    b = p->data;p->data = p->next->data;p->next->data = b;
    printf("位置%d和位置%d交換了\n",a,a+1);
    return OK;
}
int main(){
    Linklist L;
    InitList(L);
    printf("請依次輸入四個整數:\n");
    for(int r=1;r <= 4;r++)ListInsert_L(L,r);
    List_print(L);
    printf("請輸入插入的位置和數(用換行分開):\n");
    int a;
    scanf("%d",&a);
    ListInsert_L(L,a);
    List_print(L);
    Elem_search(L);
    ListDelete_L(L);
    List_print(L);
    List_exchange(L);
    List_print(L);
}

單鏈表的基本操做和順序表無異,但須要注意:訪問順序表中某一個元素時可直接訪問,訪問單鏈表中的某一元素則須要從頭結點依次訪問。指針

所用的編譯器是dev c++.code

相關文章
相關標籤/搜索