数据结构单链表C语言

#include <iostream> 
using namespace std;
#define ElemType int
#define maxSize 100
typedef struct lNode {
    ElemType data;
    struct lNode *next;
}lNode, *linkList;

//初始化一个链表
bool InitLinkList(linkList &L) {
    L = new lNode;
    L->next = NULL;
    return true;
}

//初始化输入链表中的数据头插法
bool inputLinkListHead(linkList &L) {
    lNode *p;
    ElemType data;
    cin >> data;
    while(data != -1) {
        p = new lNode;
        p->data = data;
        p->next = L->next;
        L->next = p;
        cin >> data;
    }
    return true;
}

bool inputLinkListTail(linkList &L) {
    lNode *p;
    lNode *tail;
    tail = L;
    ElemType data;
    cin >> data;
    while(data != -1) {
        p = new lNode;
        p->data = data;
        tail->next = p;
        tail = tail->next;
        cin >> data;
    }
    tail->next = NULL;
    return true;
}

// 输出此时链表的长度
int outputLengthLinkList(linkList L) {
    int res = 0;
    lNode *p;
    p = L->next;
    while(p != NULL) {
        res ++;
        p = p->next;
    }
    return res;
}

bool outputLinkList(linkList L) {
    lNode *p;
    p = L->next;
    while(p) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
    return true;
}

// 向链表中的第i个位置插入data为e的结点
bool insertLinkList(linkList &L, int i, ElemType e) {
    lNode *p;
    p = L;
    for(int j = 0; j < i-1; j ++) {
        p = p->next;
        if(p == NULL) {
            break;
        }
    }
    if(p == NULL) return false;
    lNode *newP;
    newP = new lNode;
    newP->data = e;
    newP->next = p->next;
    p->next = newP;
    return true;
}

// 找到结点值为e的结点,返回其所在的位置序号
int searchLinkList(linkList &L, ElemType e) {
    int res = 0;
    lNode *p;
    p = L;
    int flag = 0;
    while(p != NULL) {
        p = p->next;
        res ++;
        if(p->data == e) {
            flag = 1;
            break;
        }
    }
    if(flag == 0) return -1;
    else return res;
}

// 在第一个结点的data值为E的结点之后插入结点值为e的结点
bool insertLinkList_eAfterE(linkList &L, ElemType E, ElemType e) {
    int res = searchLinkList(L, E);
    if(res == -1) return false;
    else {
        bool flag = insertLinkList(L, res, e);
        return flag;
    }
}

// 在第一个结点的data值为E的结点之前插入结点值为e的结点
bool insertLinkList_eBeforeE(linkList &L, ElemType E, ElemType e) {
    int res = searchLinkList(L, E);
    if(res == -1) return false;
    else {
        bool flag = insertLinkList(L, res + 1, e);
        return flag;
    }
}

// 删除第i个结点
bool deleteLinkListI(linkList &L, int i) {
    int res = outputLengthLinkList(L);
    if(res < i) return false;
    lNode *p;
    p = L;
    for(int j = 0; j < i-1; j ++) {
        p = p->next;
    }
    lNode *q;
    q = p->next;
    p->next = q->next;
    delete q;
    return true;
}

// 删除第一个结点值为e的结点
bool deleteLinkListE(linkList &L, ElemType e) {
    lNode *p;
    p = L;
    while(p != NULL) {
        p = p->next;
        if(p->next->data == e) break;
    }
    if(p->next == NULL) return false;
    else {
        lNode *q;
        q = p->next;
        p->next = q->next;
        delete q;
        return true;
    }
}

int main() {
    // linkList L1;
    linkList L2;
    // InitLinkList(L1);
    InitLinkList(L2);
    // inputLinkListHead(L1);
    inputLinkListTail(L2);
    // outputLinkList(L1);
    // outputLinkList(L2);
    // insertLinkList(L2, 10, 15);
    // outputLinkList(L2);
    // int res = searchLinkList(L2, 2);
    // cout << res << endl;
    // insertLinkList_eAfterE(L2, 3, 100);
    // outputLinkList(L2);
    deleteLinkListE(L2, 4);
    outputLinkList(L2);
    // int res = outputLengthLinkList(L2);
    // cout << res << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值