天天看點

資料結構學習——單連結清單ADT(程式化)

看了一點網上的代碼,結合自己對連結清單的了解。将對連結清單常用的操作集合程式化如下:

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
    int Val;
    struct Node *next;
}List;

List *list_add(List **p,int Val);//此處是二級指針
void List_Print(List *p);
List *list_insert(List **p,int Val,int i);//i為插入的位置 Val插入的值
List *list_remove(List **p,int i);//删除指定位置i的值


int main()
{
    List *n=NULL;
    list_add(&n,0);
    list_add(&n,1);
    list_add(&n,2);
    list_add(&n,3);
    list_add(&n,4);
    list_insert(&n,5,3);
    list_insert(&n,6,2);
    list_remove(&n,2);
    list_remove(&n,3);
    List_Print(n);
    return 0;
}

List *list_remove(List **p,int i)//删除指定位置i的值
{
    int count=0;
    List *q,*a;
    a=*p;
    if(p==NULL)
        return NULL;
    for(count=0;count<(i-2);count++)
    {
        a=a->next;
        if(a==NULL)
            return NULL;
    }
    q=a->next;//後繼元
    a->next=q->next;
    return *p;
}

List *list_insert(List **p,int Val,int i)
{
    int count=0;
    List *q,*a;
    a=*p;
    if(p==NULL)
        return NULL;
    for(count=0;count<(i-2);count++)
    {
        a=a->next;
        if(a==NULL)
            return NULL;
    }
    q=a->next;//後繼元

    List *temp=(List *)malloc(sizeof(List));
    temp->next=q;
    temp->Val=Val;
    a->next=temp;
    return *p;
}

List *list_add(List **p,int Val)//此處是二級指針
{
    if(p==NULL)
        return NULL;

    List *temp=(List *)malloc(sizeof(List));
    temp->next=*p;
    temp->Val=Val;
    *p=temp;  //頭指針移動到開始處 *P在此處的作用為頭指針

    return *p;
}

void List_Print(List *p)
{
    if(p==NULL)
        printf("list is empty\n");
    while(p)
    {
         printf("%d\t",p->Val);
         p=p->next;
    }
}
           

繼續閱讀