1. 程式人生 > >刪除單鏈表中多個重複值

刪除單鏈表中多個重複值

題目

在不帶表頭結點的單鏈表,增加一個函式,刪除表中指定的元素值 x ,假設該元素值在單鏈表中可能出現多次。

部分程式碼

刪除多個重複值函式

PS:此函式有漏洞,有些情況不能實現題目所述功能,待改進。

Status del(SingleList *L, int n,int y){
    Node *q,*p,*t;
    int j,i=0;
    if(!L->n){
        return ERROR;
    }
    p=L->first;
    q=p->link;
    t=L->first;
    while
(t->link!=NULL){ //p指向當前位置,判斷是否等於想刪除元素 if(p->element==y){ // 相等的情況 if(p==L->first){ // 如果p是第一位 L->first=q; free(p); p=q; q=p->link; t=p; } else if(p->link==NULL){ t->
link=NULL; free(p); free(q); } else{ // p不是第一位 for(j=0;j<i-1;j++){ t=t->link; } t->link=q; free(p); p=q; q=p->link; } } else
{ t=p; p=q; q=p->link; i++; } } return OK; }

完整程式

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1

typedef struct Node {
    ElemType element;
    struct Node * link;
}Node;

typedef struct {
    struct Node* first;
    int n;
}SingleList;

Status Init(SingleList *L);
Status Output(SingleList L);
Status del(SingleList *L, int mSize,int y);
Status Insert(SingleList *L, int i, ElemType x);
// Status Delete(SeqList *L,int i);
// void Destory(SeqList *L);


// 單鏈表的初始化
Status Init(SingleList *L) {
    L->first = NULL;
    L->n = 0;
    return OK;
}



Status del(SingleList *L, int n,int y){
    Node *q,*p,*t;
    int j,i=0;
    if(!L->n){
        return ERROR;
    }
    p=L->first;
    q=p->link;
    t=L->first;
    while(t->link!=NULL){  //p指向當前位置,判斷是否等於想刪除元素
        if(p->element==y){  // 相等的情況
            if(p==L->first){  // 如果p是第一位
                L->first=q;
                free(p);
                p=q;
                q=p->link;
                t=p;
            }
            else if(p->link==NULL){
                t->link=NULL;
                free(p);
                free(q);
            }
            else{  // p不是第一位
                for(j=0;j<i-1;j++){
                    t=t->link;
                }
                t->link=q;
                free(p);
                p=q;
                q=p->link;
            }
        }
        else{
            t=p;
            p=q;
            q=p->link;
            i++;
        }
    }
    return OK;
}



Status Insert(SingleList *L, int i, ElemType x) {
    Node *p, *q;
    int j;
    if (i<-1 || i>L->n - 1)
        return ERROR;
    p = L->first;
    for (j = 0; j < i; j++) {
        p = p->link;
    }
    q = (Node*)malloc(sizeof(Node));
    q->element = x;
    if (i > -1) {
        q->link = p->link;
        p->link = q;
    }
    else {
        q->link = L->first;
        L->first = q;
    }
    L->n++;
    return OK;
}


// 單鏈表的輸出
Status Output(SingleList L) {
    Node *p;
    if (!L.n)
        return ERROR;
    p = L.first;
    while (p) {
        printf("%d ",p->element);
        p = p->link;
    }
    return OK;
}



void main()
{
    int i, x, nn,y;
    SingleList list;
    scanf("%d", &nn);
    //printf("\n");
    Init(&list);
    for (i = 0; i < nn; i++) {
        scanf("%d", &x);
        Insert(&list, i - 1, x);
    }
    Output(list);
    printf("\n");
    scanf("%d",&y);
    del(&list,nn,y);
    printf("\n");
    Output(list);
    printf("\n");
}

實驗結果

成功的情況

這裡寫圖片描述

失敗的情況

這裡寫圖片描述