C代码实现单链表基本操作

笔记

C代码实现单链表基本操作

#include<stdio.h>
#include<malloc.h>

typedef char ElemType;

struct Lnode{
	ElemType data;
	struct Lnode *next;
}

//初始化指针
setnull(struct Lnode **p){
    *p=NULL;
}


//输出链表长度
int length(struct Lnode **p){
    int n=0;
    struct Lnode *q=*p;
    while(q!=NULL){
        n++;
        q=q->next;
    }
    return n;
}

//取出某一节点
ElemType get(struct Lnode **p,int i){
    int j=1;
    struct Lnode *q=*p;
    while(j<i&&q!=NULL){
        q=q->next;
        j++;
    }
    if(q!=NULL)
        return q->data;
    else
        printf("位置参数不正确");
}     

//查找data域为x的节点个数
int locate(struct Lnode **p,ElemType x){
    int n=0;
    struct Lnode *q=*p;
    while(q!=NULL&&q->data!=x)    //查找data域为x的第一个节点
    {
        q=q->next;
        n++;
    }
    if(q==NULL)
        return -1;        //未找到data域为x的节点
    else
        return n+1;       //找到data域等于x的节点
}

//插入节点
void insert(struct Lnode **p,ElemType x,int i){
    int j=1;
    struct Lnode *s,*q;
    s=(struct Lnode *)malloc(sizeof(struct Lnode));  //分配要插入节点的内存
    s->data=x;
    q=*p;
    if(i==1){
        s->next=q;
        *p=s;
    }
    else{
        while(j<i-1&&q->next!=NULL)    //查找第一个节点
        {
            q=q->next;
            j++;
        }
        if(j==i-1)   //找到第i-1个节点,由q指向它
        {
            s->next=q->next;      //将节点s插入q
            q->next=s;
        }
        else
            printf("位置参数不正确");
        }
}


//删除节点
void deleteit(struct Lnode **p,int i){
    int j=1;
    struct Lnode *q=*p,*t;
    if(i==1)                //删除链表头节点
    {
        t=q;
        *p=q->next;
    }
    else{
        while(j<i-1&&q->next!=NULL)     //查找第i-1个节点
        {
            q=q->next;
            j++;
        }
        if(q->next!=NULL&&j==i-1)      //找到第i-1个节点,由q指向它
        {
            t=q->next;                 //t指向要删除的节点
            q->next=t->next;           /*将q之后的节点删除*/
        }
        else 
            printf("位置参数不正确\n");
    }
    if(t!=NULL)                      //在t不为空的时候释放内存
        free(t);
}


//输出

 void display(struct Lnode **p){
    struct Lnode *q;
    q=*p;
    printf("单链表显示:\n");
    if(q==NULL)
        printf("链表为空!");
    else if(q->next==NULL)          //链表只有一个节点
        printf("%c\n",q->data);
    else{
        //链表存在一个以上的节点
        while(q->next!=NULL){           //显示节点
            printf("%c\n",q->data);
            q=q->next;
        }
        printf("%c",q->data);     //显示最后的节点
    }
    printf("\n");

}


int main(){
    int n=0;
    int m=0;

    struct Lnode *head;
    setnull(&head);
    insert(&head,'a',1);
    insert(&head,'b',2);
    insert(&head,'c',3);
    insert(&head,'d',4);
    insert(&head,'e',5);
    insert(&head,'f',6);
    insert(&head,'g',7);

    display(&head);

    printf("单链表长度=%d\n",length(&head));
    
    while(m<7){
        printf("删除节点:");
        scanf("%d",&n);
        deleteit(&head,n);
        display(&head);

        m++;
    }
return 0;
}
c4c

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注