链表之单链表

链表表示方法

方法1:
结构体:这里写图片描述
主函数中:这里写图片描述
调用函数中:这里写图片描述


方法2:(这里用的是栈的存储方式,但同样适用于链表)
结构体:这里写图片描述
主函数中:这里写图片描述
调用函数中:这里写图片描述


方法3:
结构体:这里写图片描述
主函数中:
这里写图片描述
调用函数中:这里写图片描述
(这里的Status为 typedef int Status)


单链表代码

#include<stdio.h>
#include<stdlib.h>
struct student
{
    int num;
    float score;
    struct student *next;
};
int n;

struct student *creat()
{
    struct student *head;
    struct student *p1, *p2;
    n = 0;
    p1 = p2 = (struct student*)malloc(sizeof(struct student));
    scanf("%d%f", &p1->num, &p1->score);
    head = NULL;
    while (p1->num != 0)
    {
        n = n + 1;
        if (n == 1)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        p1 = (struct student*)malloc(sizeof(struct student));
        scanf("%d%f", &p1->num, &p1->score);
    }
    p2->next = NULL;
    return head;
}


struct student *insert(struct student *head, struct student *stu)
{
    struct student *p0, *p1, *p2;
    p1 = head;
    p0 = stu;
    if (head == NULL)
    {
        head = p0;
        p0->next = NULL;
    }
    else
    {
        while ((p0->num > p1->num) && (p1->next != NULL))
        {
            p2 = p1;
            p1 = p1->next;
        }
        if (p0->num <= p1->num)
        {
            if (head == p1)
            {
                head = p0;
            }
            else
            {
                p2->next = p0;
            }
            p0->next = p1;
        }
        else
        {
            p1->next = p0;
            p0->next = NULL;
        }
        n = n + 1;
        return head;
    }
}


struct student *del(struct student *head, int num)
{
    struct student *p1, *p2;
    if (head == NULL)
    {
        printf("\nlist null\n");
        return head;
    }
    p1 = head;
    while (num != p1->num && p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (num == p1->num)
    {
        if (p1 == head)
        {
            head = p1->next;
        }
        else
        {
            p2->next = p1->next;
        }
        n = n - 1;
    }
    else
    {
        printf("%d not been found!\n",num);
    }
    return head;
}


void print(struct student *head)
{
    struct student *p;
    puts("Now these %d records are:\n", n);
    p = head;
    if (head != NULL)
    {
        do
        {
            printf("%d%5.1f\n", p->num, p->score);
            p = p->next;
        } while (p != NULL);
    }
}

int main(void)
{
    struct student *head, *stu;
    int del_num;
    int i;

    printf("input records(when num==0&&score==0,OVAR!):\n");
    head = creat();
    print(head);


    printf("input the deleted number:(when num==0,OVAR!)\n");
    scanf("%d", &del_num);
    while (del_num != 0)
    {
        head = del(head, del_num);
        print(head);
        printf("input the delted number!\n");
        scanf("%d", &del_num);
    }

    printf("input the insert number(when num==0&&score==0,OVAR!):\n");
    stu = (struct student *)malloc(sizeof(struct student));
    scanf("%d%f", &stu->num, &stu->score);
    while (stu->num!=0)
    {
        head = insert(head, stu);
        print(head);
        printf("input the insert number:\n");
        stu = (struct student *)malloc(sizeof(struct student));
        scanf("%d%f", &stu->num, &stu->score);
    }


    getch();
    return  0;
}

测试结果:
这里写图片描述


单链表代码2

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定义链表节点
typedef int bool;

typedef struct Node
{
    int data;  //数据域
    struct Node * pNext; //指针域
}NODE, *PNODE;  //NODE等价于struct Node, PNODE等价于struct Node *
//函数声明
PNODE createLinkList(void);    //创建链表的函数
void traverseLinkList(PNODE pHead);   //遍历链表的函数
bool isEmpty(PNODE pHead);    //判断链表是否为空的函数
int getLength(PNODE pHead);    //获取链表长度的函数
bool insertElement(PNODE pHead, int pos, int val); //向链表中插入元素的函数,三个参数依次为链表头结点、要插入元素的位置和要插入元素的值
bool deleteElement(PNODE pHead, int pos, int * pVal); //从链表中删除元素的函数,三个参数依次为链表头结点、要删除的元素的位置和删除的元素的值
void sort(PNODE pHead);     //对链表中的元素进行排序的函数(基于冒泡排序)
int main(void)
{
    int val;   //用于保存删除的元素
    PNODE pHead = NULL;  //PNODE等价于struct Node *
    pHead = createLinkList(); //创建一个非循环单链表,并将该链表的头结点地址赋给pHead
    traverseLinkList(pHead); //调用遍历链表的函数
    if (isEmpty(pHead))
        printf("链表为空!\n");
    else
        printf("链表不为空!\n");
    printf("链表的长度为:%d\n", getLength(pHead));
    //调用冒泡排序函数
    sort(pHead);
    //重新遍历
    traverseLinkList(pHead);
    //向链表中指定位置处插入一个元素
    int m,i;
    printf("要插入的元素:");
    scanf("%d", &m);
    printf("要插入的位置:");
    scanf("%d", &i);
    if (insertElement(pHead, i, m))
        printf("插入成功!插入的元素为:%d\n", m);
    else
        printf("插入失败!\n");
    //重新遍历链表
    traverseLinkList(pHead);
    //删除元素测试
    int n;
    printf("要删除第几个元素?");
    scanf("%d", &n);
    if (deleteElement(pHead, n, &val))
        printf("元素删除成功!删除的元素是:%d\n", val);
    else
        printf("元素删除失败!\n");
    traverseLinkList(pHead);
    system("pause");
    return 0;
}

PNODE createLinkList(void)
{
    int length; //有效结点的长度
    int i;
    int value; //用来存放用户输入的结点的值
    //创建了一个不存放有效数据的头结点
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    if (NULL == pHead)
    {
        printf("内存分配失败,程序退出!\n");
        exit(-1);
    }
    PNODE pTail = pHead; //pTail始终指向尾结点
    pTail->pNext = NULL; //清空指针域
    printf("请输入您想要创建链表结点的个数:len = ");
    scanf("%d", &length);
    for (i = 0; i<length; i++)
    {
        printf("请输入第%d个结点的值:", i + 1);
        scanf("%d", &value);
        PNODE pNew = (PNODE)malloc(sizeof(NODE));
        if (NULL == pHead)
        {
            printf("内存分配失败,程序退出!\n");
            exit(-1);
        }
        pNew->data = value; //向新结点中放入值
        pTail->pNext = pNew; //将尾结点指向新结点
        pNew->pNext = NULL; //将新结点的指针域清空
        pTail = pNew;  //将新结点赋给pTail,使pTail始终指向为尾结点
    }
    return pHead;
}

void traverseLinkList(PNODE pHead)
{
    PNODE p = pHead->pNext;
    while (NULL != p)
    {
        printf("%d ", p->data);
        p = p->pNext;
    }
    printf("\n");
    return;
}

bool isEmpty(PNODE pHead)
{
    if (NULL == pHead->pNext)
        return 1;
    else
        return 0;
}

int getLength(PNODE pHead)
{
    PNODE p = pHead->pNext;  //指向首节点
    int len = 0;   //记录链表长度的变量
    while (NULL != p)
    {
        len++;
        p = p->pNext;  //p指向下一结点
    }
    return len;
}

void sort(PNODE pHead)
{
    int len = getLength(pHead); //获取链表长度  
    int i, j, t;   //用于交换元素值的中间变量
    PNODE p, q;   //用于比较的两个中间指针变量
    for (i = 0, p = pHead->pNext; i<len - 1; i++, p = p->pNext)
    {
        for (j = i + 1, q = p->pNext; j<len; j++, q = q->pNext)
        {
            if (p->data > q->data)
            {
                t = p->data;
                p->data = q->data;
                q->data = t;
            }
        }
    }
    return;
}

bool insertElement(PNODE pHead, int pos, int val)
{
    int i = 0;
    PNODE p = pHead;
    //判断p是否为空并且使p最终指向pos位置的结点
    while (NULL != p && i<pos - 1)
    {
        p = p->pNext;
        i++;
    }
    if (NULL == p || i>pos - 1)
        return 0;
    //创建一个新结点
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if (NULL == pNew)
    {
        printf("内存分配失败,程序退出!\n");
        exit(-1);
    }
    pNew->data = val;
    //定义一个临时结点,指向当前p的下一结点
    PNODE q = p->pNext;
    //将p指向新结点
    p->pNext = pNew;
    //将q指向之前p指向的结点
    pNew->pNext = q;
    return 1;
}

bool deleteElement(PNODE pHead, int pos, int * pVal)
{
    int i = 0;
    PNODE p = pHead;
    //判断p是否为空并且使p最终指向pos结点
    while (NULL != p->pNext && i<pos - 1)
    {
        p = p->pNext;
        i++;
    }
    if (NULL == p->pNext || i>pos - 1)
        return 0;
    //保存要删除的结点
    *pVal = p->pNext->data;
    //删除p后面的结点
    PNODE q = p->pNext;
    p->pNext = p->pNext->pNext;
    free(q);
    q = NULL;
    return 1;
}

测试结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值