1. 程式人生 > 其它 >單鏈表的建立,列印,釋放,刪除指定節點

單鏈表的建立,列印,釋放,刪除指定節點

技術標籤:C語言基礎單鏈表c語言

*單鏈表的建立,列印,釋放,刪除指定節點

直接看程式碼
(菜鳥創作,技術太菜,不喜勿噴,謝謝)

 struct cell { //單鏈表結點結構體定義
 int x;
 struct cell* next;
};

建立單鏈表


struct cell* build(void) { //新建單鏈表,並將建好的單鏈表首結點地址返回
 struct cell* head,*tmp,*p;
 head = tmp = p = NULL;
 int n;

 scanf("%d",&n);
 if(n==0)//輸入的資料以0結束
    return
head; else{ p=(struct cell*)malloc(sizeof(struct cell)); head=p; p->x=n; p->next=NULL; tmp=p; scanf("%d",&n); while(n!=0){ p=(struct cell*)malloc(sizeof(struct cell)); p->next=NULL; p->x=n; tmp->
next=p; tmp=p; scanf("%d",&n); } } return head; //返回單鏈表頭 }

列印單鏈表

void print(struct cell* head) {//列印整個單鏈表,head是指向單鏈表首結點的指標

      struct cell * ph=head;
      if(ph==NULL){
        printf("NULL");
        return; }
      else{
            printf("%d"
,ph->x); ph=ph->next; while(ph!=NULL){ printf("%d",ph->x);//自己選擇是否加空格 ph=ph->next; } } }

**

釋放空間

**

```void print(struct cell* head) {//列印整個單鏈表,head是指向單鏈表首結點的指標

      struct cell * ph=head;
      if(ph==NULL){
        printf("NULL");
        return; }
      else{
            printf("%d",ph->x);
            ph=ph->next;
        while(ph!=NULL){
            printf("%d",ph->x);//自己選擇是否加空格
            ph=ph->next;
        }
      }
}

刪除連結串列中指定節點

void del(struct cell**head,int m){
        struct cell *p=*head,*p1=*head;
        if(head==NULL)
            return ;
        while(p!=NULL){
            if(p->x==m){
                    if(p==*head){
                        *head=p->next;
                    }
                struct cell* t=p;
                p1->next=p->next;
               p=p->next;
                free(t);

            }
            else{
                p1=p;
                p=p->next;
            }
        }
}

來看看題目
在這裡插入圖片描述

完整程式碼

#include <stdio.h>
#include <malloc.h>
struct cell { //單鏈表結點結構體定義
 int x;
 struct cell* next;
};
struct cell* build(void) { //新建單鏈表,並將建好的單鏈表首結點地址返回
 struct cell* head,*tmp,*p;
 head = tmp = p = NULL;
 int n;

 scanf("%d",&n);
 if(n==0)
    return head;
 else{
        p=(struct cell*)malloc(sizeof(struct cell));
        head=p;
        p->x=n;
        p->next=NULL;
        tmp=p;
        scanf("%d",&n);
    while(n!=0){
        p=(struct cell*)malloc(sizeof(struct cell));
        p->next=NULL;
        p->x=n;
        tmp->next=p;
        tmp=p;
        scanf("%d",&n);
    }

  }
 return head;
 //返回單鏈表頭
}
void print(struct cell* head) {//列印整個單鏈表,head是指向單鏈表首結點的指標

      struct cell * ph=head;
      if(ph==NULL){
        printf("NULL");
        return; }
      else{
            printf("%d",ph->x);
            ph=ph->next;
        while(ph!=NULL){
            printf("%d",ph->x);//自己選擇是否加空格
            ph=ph->next;
        }
      }
}
void release(struct cell* head) {//釋放單鏈表空間,head是指向單鏈表首結點的指標
   struct cell*p1;
   while(head!=NULL){
        p1=head;
        head=p1->next;
        free(p1);
   }
}
void del(struct cell**head,int m){
        struct cell *p=*head,*p1=*head;
        if(head==NULL)
            return ;
        while(p!=NULL){
            if(p->x==m){
                    if(p==*head){
                        *head=p->next;
                    }
                struct cell* t=p;
                p1->next=p->next;
               p=p->next;
                free(t);

            }
            else{
                p1=p;
                p=p->next;
            }
        }
}
int main(void) {
 struct cell* phead;
 int key;
 phead = build();//建立連結串列
 scanf("%d",&key);
 del(&phead,key);//刪除元素
 if(phead!=NULL)
        print(phead);
    else
        printf("NULL");
 release(phead);
}

歡迎提出改進建議!謝謝!