一些实例

一些实例

1、定义一个结构体数组用以保存5个学生的以下信息:学号、姓名、性别、家庭住址、3门课程成绩。

要求:

1.从键盘输入5个学生的数据。

2.显示5个学生中有一门不及格和所有课程均不及格的人数。

3.检索学号为NUM的学生的3门课程成绩,NUM由键盘输入。

#include <stdio.h>
#define STUSIZE 5
struct student
{
    int num;
    char name[20];
    char sex[4];
    char homeaddr[50];
    float yuwen;
    float shuxue;
    float waiyu;
};

//输入学生信息
void input_stu(struct student p[])
{
    int i;
    for (i=0; i<STUSIZE; i++)
    {
        printf("请输入第%d个学生信息:\n", i+1);
        printf("请输入学号:\n");
        scanf("%d", &p[i].num);
        printf("请输入姓名:\n");
        scanf("%s", &p[i].name);
        printf("请输入性别:\n");
        scanf("%s", &p[i].sex);
        printf("请输入住址:\n");
        scanf("%s", &p[i].homeaddr);
        printf("请输入语文成绩:\n");
        scanf("%f", &p[i].yuwen);
        printf("请输入数学成绩:\n");
        scanf("%f", &p[i].shuxue);
        printf("请输入外语成绩:\n");
        scanf("%f", &p[i].waiyu);
    }
}

//检索学生信息
void findstu(struct student stu[], int num)
{
    int i = 0;
    for(i=0; i<STUSIZE; i++)
    {
        if(stu[i].num == num)
        {
            printf("此学生三门课成绩为:语文%.2f  数学%.2f  外语%.2f\n",stu[i].yuwen,stu[i].shuxue, stu[i].waiyu);
            break;
        }
        else
        {
            printf("未找到此学生!\n");
        }
    }
}

//显示不及格学生人数
void showstu(struct student stu[])
{
    int i, icount=0, acount=0;
    for(i=0; i<STUSIZE; i++)
    {
        if(stu[i].yuwen < 60 || stu[i].shuxue < 60 || stu[i].waiyu < 60)
        {
            icount ++;
        }
        if(stu[i].yuwen < 60 && stu[i].shuxue < 60 && stu[i].waiyu < 60)
        {
            acount ++;
        }
    }
    printf("有一门不及格的人数是:%d  所有课程都不及格的人数是: %d", icount, acount);
}

int main()
{
    int n=0;
    struct student stu[STUSIZE] = {0};
    input_stu(stu);
    printf("请输入要检索的学生学号:\n");
    scanf("%d", &n);
    findstu(stu, n);
    showstu(stu);

    return 0;
}

2、字符串翻转和每个单词翻转

#include <stdio.h>
#include <string.h>
#define MAX_STRING 200

void reverse_string(char str[MAX_STRING], int start, int end)
{
    char tmp = 0;

    //翻转字符串
    while (start < end)  //如果前标小于后标
    {
        //交换两个元素值
        tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
        //改变索引值
        ++start;
        --end;
    }
}

int main()
{
    int i = 0, j = 0;
    char str[MAX_STRING] = {0};
    int length = 0;
    char tmp = 0;
    int start = 0, end = 0;
    printf("输入一个字符串:\n");
    gets(str);
    length = strlen(str);
    reverse_string(str, 0, length-1);

    printf("第一步: \n");
    printf("%s\n", str);

    //依次翻转其中的每一个单词
    while (i < length)
    {
        //翻转其中的一个单词
        if (str[i] != ' ')
        {
            //找到单词的开头
            start = i;
            while (str[i] != ' ' && str[i] != '\0')
            {
                //找到单词的结尾
                ++i;
                reverse_string(str, start, i-1);
            }
            ++i;
        }
    }
    printf("第二步: \n");
    printf("%s\n", str);
    return 0;
}

3、删除数组重复的元素

#include <stdio.h>

void output(int a[], int n)
{
    int i;
    for (i=0; i<n; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int deleteElement(int a[], int n, int x)
{
    int i, j, k, num=0;
    int temp[6] = {0};
    for (i=0; i<n; i++)
    {
        if (a[i] == x)   
        {
            for (j=i; j<n; j++)    //找到符合条件的元素下标,
            {
                a[j] = a[j+1];     //用后一个元素覆盖找到的元素
            }
            num++;
        }
    }

    return n-num;
}

int main()
{
    int a[6] = {9,5,6,7,8,5};
    int num = 0;
    output(a, 6);
    num = deleteElement(a, 6, 5);
    printf("数组现在还有%d项\n", num);
    output(a, num);

    getchar();
    return 0;
}

4、链表的建立、添加、查询、插入、删除、销毁

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

struct LinkNode
{
        int data;
        struct LinkNode *next;
};
struct LinkNode *head = NULL;
struct LinkNode * CreateLink(void);
void OutputLink(struct LinkNode *);
void EndInsertNode(struct LinkNode *);
void HeadInsertNode(struct LinkNode *);
struct LinkNode *FindNode(int n);
void InsertNode(struct LinkNode *);
void DeleteNode(struct LinkNode *);
void DestroyLink(struct LinkNode *);

int main(void)
{
        struct LinkNode *phead, *pfind;
        int n = 0;
        phead = CreateLink();
        OutputLink(phead);

        printf("用尾插法添加数据:\n");
        EndInsertNode(phead);
        OutputLink(phead);

        printf("用头插法添加数据:\n");
        HeadInsertNode(phead);
        OutputLink(phead);

        printf("插入数据:\n");
        InsertNode(phead);
        OutputLink(phead);

        printf("删除数据:\n");
        DeleteNode(phead);
        OutputLink(phead);
       
        printf("销毁链表:\n");
        DestroyLink(phead);

        return 0;
}

struct LinkNode * CreateLink(void)
{
        int i = 0, n = 0;
        struct LinkNode *phead, *pend, *pmove;
        phead = (struct LinkNode *)malloc(sizeof(struct LinkNode));
        if (NULL == phead)
        {
                printf("内存分配失败,程序终止!\n");
                exit(-1);
        }
        phead->next = NULL;
        head = phead;
        pend = phead;
        printf("输入要建立的结点数:\n");
        scanf("%d", &n);
        getchar();
        printf("输入结点数值:\n");
        for (i = 0; i < n; i++ )
        {
                pmove = (struct LinkNode *)malloc(sizeof(struct LinkNode));
                if (NULL == pmove)
                {
                        printf("内存分配失败,程序终止!\n");
                        exit(-1);
                }
                scanf("%d", &pmove->data);
                getchar();
                pend->next = pmove;
                pmove->next = NULL;
                pend = pmove;
        }
        return phead;
}

void OutputLink(struct LinkNode *phead)
{
        struct LinkNode *move = phead->next;
        while (NULL != move)
        {
                printf("%3d", move->data);
                move = move->next;
        }
        printf("\n");
}

void EndInsertNode(struct LinkNode *phead)
{
        int number = 0;
        struct LinkNode *pnow, *pmove;
        pnow = phead;
        if (NULL == phead)
        {
                printf("链表为空。\n");
                exit(-1);
        }
        while (NULL != pnow->next)
        {
                pnow = pnow->next;
        }
        printf("输入要添加的数(输入-1结束):\n");
        while (1)
        {
                pmove = (struct LinkNode *)malloc(sizeof(struct LinkNode));               
                scanf("%d", &number);
                if (number != -1)
                {
                        pmove->data = number;
                        pnow->next = pmove;
                        pmove->next = NULL;
                        pnow = pmove;                       
                }
                else
                        break;               
        }
}

void HeadInsertNode(struct LinkNode *phead)
{
        int number = 0;
        struct LinkNode *pnow, *pmove;
        if (NULL == phead)
        {
                printf("链表为空。\n");
                exit(-1);
        }
        pnow = phead;
        printf("输入要添加的数(输入-1结束):\n");
        while (1)
        {
                pmove = (struct LinkNode *)malloc(sizeof(struct LinkNode));
                scanf("%d", &number);
                if (number != -1)
                {
                        pmove->data = number;                       
                        pmove->next = pnow->next;
                        pnow->next = pmove;
                }
                else
                        break;
        }
}

struct LinkNode *FindNode(int n)
{
        struct LinkNode  *phead, *pnow, *pfind = NULL;

        phead = head;
        pnow = phead;
        if (NULL == phead)
        {
                printf("链表为空。\n");
                exit(-1);
        }
        while (NULL != pnow->next)
        {
                if (pnow->data == n)
                {
                        pfind = pnow;
                        printf("%d\n", pnow->data);
                        return pfind;
                }                       
                pnow = pnow->next;
        }
        printf("未找到!");       
}

void InsertNode(struct LinkNode *phead)
{
        int num = 0;
        struct LinkNode *move = phead, *pfind = NULL;
        printf("输入要在哪个数值后插入新的数值:\n");
        scanf("%d", &num);
        getchar();
        while (NULL != move)
        {
                if (move->data == num)
                {
                        pfind = (struct LinkNode *)malloc(sizeof(struct LinkNode));
                        printf("输入要插入的数:\n");
                        scanf("%d", &pfind->data);
                        if (move->next == NULL)
                        {
                                move->next = pfind;
                                pfind->next = NULL;
                        }
                        else
                        {
                                pfind->next = move->next;
                                move->next = pfind;
                        }
                       
                        return;
                }
                move = move->next;
        }
        printf("未找到!\n");
}

void DeleteNode(struct LinkNode *phead)
{
        int num = 0;
        struct LinkNode *pnow = phead, *pfind = NULL;
        printf("输入要删除的数:\n");
        scanf("%d", &num);
        while (NULL != pnow->next)
        {
                if (pnow->next->data == num)
                {
                        pfind = pnow->next;
                        if (pfind->next != NULL)
                        {
                                pnow->next = pnow->next->next;                               
                        }
                        else
                        {
                                pnow->next = NULL;
                        }
                        free(pfind);
                        pfind = NULL;
                        return;
                }
                pnow = pnow->next;
        }
        printf("无该结点!\n");
}

void DestroyLink(struct LinkNode *phead)
{
        struct LinkNode *save = phead;
        while (NULL != phead)
        {
                save = phead->next;
                free(phead);
                phead = save;               
        }
        if (NULL == phead)
        {
                printf("链表已销毁!\n");
        }
}

5、数据结构-线性表-顺序表

#include <stdio.h>
#include <stdlib.h>
#define MAXLISTSIZE 1024 //定义顺序表最大容量

//定义顺序表节点类型
typedef struct
{
    int data[MAXLISTSIZE];  //顺序表
    int last;               //顺序表元素个数
}linearlist;

void ListList(linearlist *list)  //打印线性顺序表
{
    int i;
    printf("当前线性表的状态:\n");
    if (list->last == 0)
    {
        printf("当前顺序表为空");
    }
    else
    {
        for (i=0; i<list->last; i++)
        {
            printf("[%4d]", list->data[i]);
        }
    }
    printf("\n");
}

void Output(linearlist *list) //打印说明文档
{
    system("cls");
    printf("-                    顺序表                   -\n");
    printf("-          a:追加一个节点 i:插入一个节点      -\n");
    printf("-          d:删除一个节点 e:退出              -\n\n");
    ListList(list);
}

linearlist *CreateList()  //创建线性顺序表
{
    linearlist *list = (linearlist *)malloc(sizeof(linearlist)); //分配空间
    list->last = 0;  //初始化头节点的值
    return list;     //返回初始化头节点指针
}

void AppendNode(linearlist *list, int n)  //追加节点
{
    if(list->last < MAXLISTSIZE)   //顺序表不溢出
    {
        list->data[list->last] = n; //初始化节点值
        list->last += 1;            //顺序表长度加1
    }
}

void InsertNode(linearlist *list, int n, int pos) //插入节点
{
    int j;
    if (pos < 0 || pos > list->last)
        printf("所插入的位置超出顺序表的范围\n");
    else
    {
        for (j=list->last; j>=pos; j--) //逆向遍历顺序表
        {
            list->data[j+1] = list->data[j]; //元素后移
        }
        list->data[pos] = n;  //指向节点赋值
        list->last++;         //顺序表长度加1
    }
}

void DeleteNode(linearlist *list, int pos)
{
    int j;
    if ((pos < 0) || (pos > list->last)) //删除位置超出顺序表范围
    {
        printf("所要删除的位置超出顺序表的范围\n");
    }
    else
    {
        for (j=pos; j<list->last; j++)
            list->data[j] = list->data[j+1]; //元素前移
        list->last--;        //顺序表长度减1
    }
}

int main(void)
{
    int key, pos;   //key元素值, pos下标
    char ch;
    linearlist *list;
    list = CreateList();
    while(1)
    {
        Output(list);
        printf("请选择:");
        ch = getchar();
        fflush(stdin);     //清除缓存
        if (ch == 'a')
        {
            printf("请输入要追加的数据:");
            scanf("%d", &key);
            AppendNode(list, key);
        }
        else if (ch == 'i')
        {
            printf("请输入要插入的数据的位置:");
            scanf("%d", &pos);
            printf("请输入要插入的数据:");
            scanf("%d", &key);
            InsertNode(list, key, pos);
        }
        else if (ch == 'd')
        {
            printf("请输入要插入的数据的位置:");
            scanf("%d", &pos);
            DeleteNode(list, pos);
        }
        else if (ch == 'e')
            exit(0);
        Output(list);
        fflush(stdin);
    }
    return 0;
}

6、数据结构-线性表-单链表

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

struct linknode
{
    int data;
    struct linknode *next;
};

typedef struct linknode LinkNode;

LinkNode *CreateLinkNode()
{
    int i;
    LinkNode *head, *ptr, *p;
    head = (LinkNode *)malloc(sizeof(LinkNode));
    if (!head)
    {
        printf("内存分配失败!\n");
        exit(1);
    }
    printf("请输入第1个数据:");
    scanf("%d", &head->data);
    head->next = NULL;
    ptr = head;
    for (i=1; i<5; i++)
    {
        p = (LinkNode *)malloc(sizeof(LinkNode));
        if (!p)
        {
           printf("内存分配失败!\n");
           exit(1);
        }
        printf("请输入第%d个数据:", i+1);
        scanf("%d", &p->data);
        ptr->next = p;
        p->next = NULL;
        ptr = ptr->next; //等价于 ptr = p;
    }
    return head;
}

void PrintNode(LinkNode *ptr)
{
    while (ptr != NULL)
    {
        printf("%5d", ptr->data);
        ptr = ptr->next;
    }
    printf("\n");
}

LinkNode *FindNode(LinkNode *head, int num)
{
    LinkNode *ptr;
    ptr = head;
    while (ptr != NULL)
    {
        if (ptr->data == num)
            return ptr;
        ptr = ptr->next;
    }
    return ptr;
}

LinkNode *InsertNode(LinkNode *head, LinkNode *ptr, int value)
{
    LinkNode *newnode = (LinkNode *)malloc(sizeof(LinkNode));
    if (!newnode)
        return NULL;
    newnode->data = value;
    newnode->next = NULL;
    if (ptr == NULL)
    {
        newnode->next = head;
        return newnode;
    }
    else
    {
        if (ptr->next == NULL)
            ptr->next = newnode;
        else
        {
            newnode->next = ptr->next;
            ptr->next = newnode;
        }
    }
    return head;
}

LinkNode *DeleteNode(LinkNode *head, LinkNode *ptr)
{
    LinkNode *pre;         //指向前一结点
    if (ptr == head)       //是否是链表的开始
        return head->next; //输出第二个结点
    else
    {
        pre = head;
        while (pre->next != ptr) //找结点ptr的前结点
        {
            pre = pre->next;
        }
        if (ptr->next == NULL)  //是否是链表的结束
            pre->next = NULL;   //最后一个结点
        else
            pre->next = ptr->next;  //中间结点
    }
    free(ptr);   //释放结点内存
    return head;
}

void FreeLinkNode(LinkNode *head)
{
    LinkNode *ptr;
    while (head != NULL)
    {
        ptr = head;
        head = head->next;
        free(ptr);
    }
}



int main(void)
{
    int num, value;
    LinkNode *head, *ptr;
    head = CreateLinkNode();
    PrintNode(head);
    printf("请输入要查找的数据:\n");
    scanf("%d", &num);
    ptr = FindNode(head, num);
    if (!ptr)
    {
        printf("没有找到d\n");
    }
    else
    {
        printf("找到啦,\n请输入要插入的数据:\n");
        scanf("%d", &value);
        head = InsertNode(head, ptr, value);
        PrintNode(head);
    }
    printf("请输入要查找并删除的数据:\n");
    scanf("%d", &num);
    ptr = FindNode(head, num);
    if (!ptr)
    {
        printf("没有找到!\n");
    }
    else
    {
        printf("找到啦!\n");
        head = DeleteNode(head, ptr);
        PrintNode(head);
    }
    FreeLinkNode(head);

    return 0;
}

7、双指针的妙用

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int NodeVal;
typedef struct LinkNode_t
{
    NodeVal val;
    struct LinkNode_t *next;
}LinkNode;

//创建链表
LinkNode *createLinkNode(NodeVal *arr, size_t n)
{
    //定义头结点、普通结点、尾结点
    LinkNode *head = NULL, *node = NULL, *end = NULL;

    for (size_t i = 0; i < n; i++)
    {
        node = (LinkNode *)malloc(sizeof(LinkNode));
        if (NULL == head)
        {
            head = node;
            head->val = arr[i];
            end = head;
        }
        else
        {
            node->val = arr[i];
            end->next = node;
            end = node;
        }
    }
    end->next = NULL;
    return head;
}

//释放资源
void destoryLinkNode(LinkNode *head)
{
    LinkNode *pn = NULL;

    while ( NULL != head )
    {
        if (NULL == head->next)
        {
            free(head);
            head = NULL;
        }
        else
        {
            pn = head->next->next;
            free(head->next);
            head->next = pn;
        }
    }
}

//返回链表的中间结点,如果有两个中间结点,则返回第二个中间结点
LinkNode *findMidNode(LinkNode *head)
{
    LinkNode *fast = head;
    LinkNode *slow = head;

    while ( NULL != fast && NULL != fast->next )
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

//链表的中间结点 输出链表中倒数第k个结点
LinkNode *FindKthToTail(LinkNode *head, unsigned int k)
{
    if ( NULL == head || 0 == k )
        return head;
    LinkNode *pFast = head;
    LinkNode *pSlow = head;
    unsigned int i = 0;
    //快指针先移动
    while ( i < k - 1 )
    {
        if (NULL != pFast)
        {
            pFast = pFast->next;
        }
        //k大于链表的长度
        else
        {
            return NULL;
        }
        i++;
    }
    //快慢指针一起移动
    while ( NULL != pFast->next )
    {
        pSlow = pSlow->next;
        pFast = pFast->next;
    }
    return pSlow;
}

//判断链表是否有环
int hasLoop(LinkNode *head)
{
    if (NULL == head)
    {
        return 0;
    }
    LinkNode *slow = head;
    LinkNode *fast = head->next;
    //当快指针到末尾时,无环,结束
    while ( NULL != fast && NULL != slow )
    {
        //快慢相遇,有环
        if (fast == slow)
        {
            return 1;
        }

        slow = slow->next; //慢指针每次走一步

        fast = fast->next;
        if (fast != NULL)
        {
            fast = fast->next;
        }
    }
    return 0;
}

void printLinkNode(LinkNode *head)
{
    while ( NULL != head )
    {
        NULL == head->next ? printf("%d\n", head->val) : printf("%d->", head->val);
        head = head->next;
    }
}

int main(void)
{
    NodeVal arr[] = { 1,2,3,4,5,6,7 };
    LinkNode *head = NULL;
    head = createLinkNode(arr, sizeof(arr) / sizeof(NodeVal));
    printLinkNode(head);
    LinkNode *findNode = FindKthToTail(head, 3);
    LinkNode *findmNode = findMidNode(head);
    if (NULL != findNode)
    {
        printf("链表倒数第三个节点是: %d\n", findNode->val);
    }

    if (NULL != findmNode)
    {
        printf("链表中间结点是: %d\n", findmNode->val);
    }
    destoryLinkNode(head);
    return 0;
}

快慢指针的技巧:
    返回链表的中间结点
    分析:
       >> 快慢指针同时指向头结点,快指针走两步,慢指针走一步
       >> 如果长度为偶数,那么快指针为NULL的时候停止,长度为
          奇数,那么快指针->next为NULL的时候停止
       >> 慢指针指向的位置就是中间结点了

    返回链表倒数第k个结点
    分析:
      >> 快慢指针同时指向头结点
      >> 首先快指针移动k-1步,先走到第k个节点
      >> 快慢指针同时移动,直到快指针指向末尾,这时快慢指针都走了L-K
      >> 慢指针指向的结点就是要寻找的结点

8、顺序队列

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100  //定义队列最大有多少个
#define datatype char //定义数据类型

//结构体队列
struct queue
{
    datatype data[N];   //存放数据的数组
    int front;          //允许删除的一端称为队头
    int rear;           //允许插入的一端称为队尾
};

typedef struct queue QUEUE;

//队列接口
void initQUEUE(QUEUE *sq); //初始化顺序队列
int isempty(QUEUE *sq);    //判断队列是否为空
datatype gethead(QUEUE *sq); //获取队列最一个元素
void enQUEUE(QUEUE *sq, datatype data); //队列入队
datatype deQUEUE(QUEUE *sq);  //队列出队
void showQUEUE(QUEUE *sq); //输出队列

int main(void)
{   
    QUEUE q1;
    initQUEUE(&q1);  //初始化队列
    char *str = "abcdefg";
    char *p = str;
    while ( *p != '\0' )
    {
        enQUEUE(&q1, *p); //字符挨个入队
        showQUEUE(&q1);   //显示队列所有元素
        p++;
    }

    while ( isempty(&q1) != 1 ) //只要队列不空,就循环
    {
        printf("\n出队的字符:%c", deQUEUE(&q1)); //打印出队的字符
        showQUEUE(&q1);
    }
   
    return 0;
}

//队列接口
//初始化顺序队列
void initQUEUE(QUEUE *sq)
{
    //实现队列初始化,等价于队列清空
    sq->front = sq->rear = 0;
}

//判断队列是否为空
int isempty(QUEUE *sq)
{
    //队头与队尾重合,为空
    if (sq->front == sq->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

//获取队列最一个元素
datatype gethead(QUEUE *sq)
{
    if ( sq->front == sq->rear )
        return -1;
    //返回第一个结点的数据
    return sq->data[sq->front];
}

//队列入队
void enQUEUE(QUEUE *sq, datatype data)
{
    if (sq->rear == N)
    {
        printf("队列已满!\n");
        return;
    }
    sq->data[sq->rear] = data; //入队
    sq->rear++;  //下标移动
}

//队列出队
datatype deQUEUE(QUEUE *sq)
{
    //如果队列为空
        if ( sq->front == sq->rear )
                return -1;
    sq->front++;  //删除一个元素,向前移动一个
    return sq->data[sq->front - 1]; //返回前一个元素,即删除的元素
}

//输出队列
void showQUEUE(QUEUE *sq)
{
        if ( sq->front == sq->rear )
                return;
    else
    {
        printf("\nfront = %d, rear = %d\n", sq->front, sq->rear);
        //打印队列元素
        for (int i = sq->front; i<sq->rear; i++)
        {
            printf("%c ", sq->data[i]);
        }
        printf("\n");
    }
}

9、用类创建链表

#include <iostream>
using namespace std;

class Node
{
    private:
    int data;
    Node *next;

    public:
    Node(int data)
    {
        this->data = data;
        this->next = NULL;
    }
    static Node *pHead;  //头结点指针
    static Node *pTail;  //尾结点指针

    //向链表尾部加入结点
    static void AddNode(int data)
    {
        if ( pHead == NULL )
        {
            pHead = new Node(data);
            pTail = pHead;
            return;
        }
        pTail->next = new Node(data);
        pTail = pTail->next;
    }

    static void AddNode(Node *node)
    {
        if ( pHead == NULL )
        {
            pHead = node;
            pTail = pHead;
            return;
        }

        pTail->next = node;
        pTail = pTail->next;
    }

    //根据数据内容删除结点
    static bool DeleteNodes(int data)
    {
        bool flag = false;
        if ( pHead == NULL )
        {
            return flag;
        }
        //遍历查找符合条件的结点
        Node *pTemp = pHead;
        if ( pHead->data == data )
        {
            pTemp = pHead->next;
            delete pHead;
            pHead = pTemp;
            if ( pHead == NULL )
            {
                return flag;
            }
        }
        Node *pMove = pHead->next;
        while ( pMove != NULL )
        {
            if ( pMove->data == data )
            {
                pTemp->next = pMove->next;
                delete pMove;
                pMove = pTemp->next;
            }
            else  //迭代移动指针
            {
                pMove = pMove->next;
                pTemp = pTemp->next;
            }
        }
        return flag;
    }

    //显示链表结点信息
    static void GetNodesMessage()
    {
        if ( pHead == NULL )
        {
            cout << "当前链表为空。" << endl;
            return;
        }
        Node *pMove = pHead;
        while ( pMove != NULL )
        {
            cout << pMove->data << "->";
            pMove = pMove->next;
        }
        cout << "NULL" << endl;
    }
};

//在类外初始化静态成员变量
Node *Node::pHead = NULL;
Node *Node::pTail = NULL;

int main(void)
{
    Node::GetNodesMessage();
    int num;
    while ( true )
    {        
        cout << "输入要添加结点的数据:-1退出" << endl;
        cin >> num;
        if ( num != -1 )
        {
            Node::AddNode(num);
        }
        else
        {
            break;
        }
        system("cls");
        Node::GetNodesMessage();
    }
   
   
    Node::GetNodesMessage();
    while ( true )
    {        
        cout << "输入要删除结点的数据:-1退出" << endl;
        cin >> num;
        if ( num != -1 )
        {
            Node::DeleteNodes(num);
        }
        else
        {
            break;
        }   
        system("cls");
        Node::GetNodesMessage();
    }
    Node::GetNodesMessage();
   
    system("pause");
    return 0;
}

10、用类实现单向链表逆置

#include <iostream>
#include <string>
using namespace std;

typedef class StudentNode
{
    private:
    StudentNode *pNext;
    string m_Name;
    int m_Age;
    float m_Score;
    static StudentNode *pTail, *pHead;

    public:
    StudentNode(string name, int age, float score)
    {
        this->m_Name = name;
        this->m_Age = age;
        this->m_Score = score;
        pNext = NULL;
    }

    //添加结点成员函数
    static void AddSN(StudentNode *pSN)
    {
        if (pHead == NULL)
        {
            pHead = pSN;
            pTail = pHead;
            return;
        }
        pTail->pNext = pSN;
        pTail = pTail->pNext;
    }

    //逆置链表成员函数
    static void Reverse()
    {
        //空链表,返回
        if (pHead==NULL)
        {
            return;
        }

        //将链表从头部开始解体,重新构成新链表
        StudentNode *pTemp = pHead,   //改变当前位置结点的指向
            *pMove = pHead->pNext;    //记录原链表下一个位置结点
        pHead->pNext = NULL;          //断链
        pTail = pHead;                //将链表尾部逆置

        while ( pMove != NULL )
        {
            pTemp = pMove;
            pMove = pMove->pNext;
            pTemp->pNext = pHead;
            pHead = pTemp;
        }
    }

    //显示输出链表
    static void GetMessage()
    {
        if (pHead == NULL)
        {
            cout << "当前链表为空" << endl;
            return;
        }

        StudentNode *pMove = pHead;
        cout << "===============================" << endl;
        cout << "姓名\t年龄\t成绩" << endl;
        cout << "===============================" << endl;
        while ( pMove != NULL )
        {
            cout << pMove->m_Name << "\t"
                << pMove->m_Age << "\t"
                << pMove->m_Score << endl;
            pMove = pMove->pNext;
        }
    }
}SN;

//类外初始化静态成员变量
SN *SN::pHead = NULL;
SN *SN::pTail = NULL;

int main(void)
{
    SN::GetMessage();
    cout << "创建链表" << endl;
    SN::AddSN(new SN("张三", 18, 4.4f));
    SN::AddSN(new SN("李四", 17, 4.5f));
    SN::AddSN(new SN("王五", 19, 5.0f));
    SN::GetMessage();
    cout << endl << "逆转链表" << endl;
    SN::Reverse();
    SN::GetMessage();
    cout << endl << "向新链表中添加结点" << endl;
    SN::AddSN(new SN("赵六", 18, 4.7f));
    SN::GetMessage();
   
    system("pause");
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值