c单链表基本操作,本人已祥测

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


using namespace std;




typedef int elemType;
typedef struct Node
{
    elemType element;
    struct Node *next;
}Node;




Node *l;
//初始化  
void init_liat(Node *i)
{
    i = NULL;
    printf("初始化链表成功\n");
}




///@note创建链表  
//p2属于中间变量,用于不停地给p1赋值,l属于head  
Node *creat_list()
{
    Node *p1, *p2;//p1是尾指针,p2是中间指针,l是首指针  
    p1 = (Node *)malloc(sizeof(struct Node));
    p2 = (Node *)malloc(sizeof(struct Node));
    if (p1 == NULL || p2 == NULL)
    {
        printf("内存分配失败\n");
        exit(0);
    }
    //memset(p1, 0, sizeof(struct Node));
    printf("请输入链表中的值");
    cin >> p1->element;
    p1->next = NULL;
    while (p1->element > 0)
    {
        if (l == NULL)
        {
            l = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        p1 = (Node *)malloc(sizeof(struct Node));
        if (p1 == NULL || p2 == NULL)
        {
            printf("内存分配失败\n");
            exit(0);
        }
        //memset(p1, 0, sizeof(struct Node));
        printf("请输入链表中的值");
        cin >> p1->element;
        p1->next = NULL;
    }
    printf("创建表成功\n");
    return l;
}




//打印链表  
int print_list(Node *i)
{
    Node *p = i;
    if (NULL == i)
    {
        cout << "List is null" << endl;
        return 0;
    }
    cout << "print list as flollows" << endl;
    while (p != NULL)
    {
        cout << p->element << endl;
        p = p->next;
    }
    return 1;
}




//清空链表  
Node *clear_list(Node *i)
{
    Node *p = i;
    Node *temp = NULL;
    if (p == NULL)
    {
        printf("链表为空不需要清空\n");
        exit(0);
    }
    while (p != NULL)
    {
        temp = p->next;
        free(p);
        p = temp;
    }
    l = NULL;
    if (l == NULL)
    {
        printf("清空链表\n");
    }
    return l;
}




//list 的长度  
int length_list(Node *l)
{
    int cout = 0;
    printf("length_list运行成功!\n");
    if (l == NULL)
    {
        printf("list is null");
        return 0;
    }
    while (l != NULL)
    {
        ++cout;
        l = l->next;
    }
    return cout;
}




//获取某个节点的信息  
elemType get_pos_element(Node *k, int pos)
{
    int i = 1;
    if (k == NULL)
    {
        printf("list is null");
        exit(0);
    }
    if (pos < 1)
    {
        printf("pause");
        exit(0);
    }
    while (k != NULL)
    {
        if (i == pos)
        {
            printf("list %d element is:%d\n", pos, k->element);
            return k->element;
        }
        k = k->next;
        ++i;
    }
    printf("no element");
    exit(0);
}


//
Node* get_pos_prev_address(Node *l, int pos)
{
    Node *prev = NULL;
    int i = 0;
    if (l == NULL)
    {
        printf("get_pos_address()运行成功,链表为空, 获取元素失败!\n");
        system("pause");
        return NULL;
    }
    if (pos < 1)
    {
        printf("get_pos_address()运行成功,给定节点数非法, 获取元素失败!\n");
        system("pause");
        return NULL;
    }
    while (l != NULL)
    {
        if (i == pos)
        {
            printf("get_pos_address()运行成功,第%d个节点元素前一结点的地址为0x%x!\n", pos, l);
            return prev; 
        }
        prev = l;
        l = l->next;
        ++i;
    }
    printf("get_pos_ress()运行成功,超出查找范围!\n");
    system("pause");
    return NULL;
}


Node * get_element_position(Node *l, elemType x)
{
    if (l == NULL)
    {
        printf("get_element_position运行成功,链表为空, 获取元素失败!\n");
        system("pause");
        exit(0);
    }
    while (l != NULL)
    {
        if (l->element == x)
        {
            printf("get_element_position运行成功,该链表中元素%d的地址为0x%x\n", x, l);
        }
        l = l->next;
    }
    printf("get_element_position运行成功,该链表不含有元素%d\n", x);
    return NULL;
}


Node *get_element_prev_position(Node *l, elemType x)
{
    Node *prev = NULL;
    if (l == NULL)
    {
        printf("get_element_prev_position运行成功,链表为空, 获取元素失败!\n");
        system("pause");
        exit(0);
    }
    while (l != NULL)
    {
        if (l->element == x)
        {
            printf("get_element_prev_position运行成功,该链表中元素%d前一结点的地址为0x%x\n", x, l);
            return prev;
        }
        prev = l;
        l = l->next;
    }
    printf("get_element_prev_position运行成功,该链表不含有元素%d\n", x);
    return NULL;
}


int modify_element(Node *l, int pos, elemType x)
{
    int i=0;
    if (l == NULL)
    {
        printf("modify_element函数运行成功,链表为空, 修改失败!\n");
        system("pause");
        return 0;
    }
    if (pos < 1)
    {
        printf("modify_element函数运行成功,给定节点非法!\n");
        system("pause");
        return 0;
    }
    while (l != NULL)
    {
        if (i == pos)
        {
            l->element = x;
            printf("modify_element函数运行成功,已更换第%d个节点为 %d!\n", pos, x);
            return 1;
        }
        l = l->next;
        ++i;
    }
    printf("modify_element函数运行成功,超出查找范围!\n");
    system("pause");
    return 0;
}


void insert_head_node(Node **l, elemType x)
{
    Node *insert_node;
    insert_node = (Node *)malloc(sizeof(Node));
    insert_node->element = x;
    insert_node->next = *l;


    *l = insert_node;
    printf("insert_head_list运行成功,向表头添加元素%d!\n", x);
}


void insert_end_node(Node **l, elemType x)
{
    Node *insert_node, *last = NULL;
    Node *p = (*l);
    insert_node = (Node *)malloc(sizeof(Node));


    while (p != NULL)
    {
        last = p;
        p = p->next;
    }
    last->next = insert_node;
    insert_node->element = x;
    insert_node->next = NULL;
    printf("insert_end_list运行成功,向末尾添加元素%d!\n", x);
}


int insert_pos_list(Node **l, int pos, elemType x)
{
    Node *insert_node = (Node *)malloc(sizeof(Node));
    Node *pos_node = get_pos_prev_address(*l, pos);
    if (pos_node == NULL)
    {
        printf("insert_pos_list已运行,但向第%d个节点处添加元素%d时失败,请查看上述提示\n", pos, x);
        return 0;
    }
    insert_node->element = x;
    insert_node->next = pos_node->next;
    pos_node->next = insert_node;
}


//p为反转后的头,反转link_list
Node *ReverseList(Node *head)
{
    if (NULL == head || NULL == head->next)
        return head;
    Node* p;
    Node* q;
    Node* r;
    p = head;
    q = head->next;
    head->next = NULL;
    while (q){
        r = q->next; //  
        q->next = p;
        p = q; //  
        q = r; //  
    }
    head = p;
    print_list(head);
    return head;
}


void main()
{
    init_liat(l);
    creat_list();
    print_list(l);


    ReverseList(l);
    //get_pos_element(l, 2);
    system("pause");
}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值