初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点

来源:互联网 发布:电脑的网络有个感叹号 编辑:程序博客网 时间:2024/06/05 21:15

本科ee 连数据结构都没学过 只能靠烟酒生时期恶补了 这是看小甲鱼的数据结构讲解视频 u做的一道练习题,涉及了单链表的建立 遍历 节点插入和删除 找出中间节点 理解了这些 简单的单链表应该就没问题了
不说了 上程序


/*            初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点       编译环境:vs2015       编译系统:windows 10 64*/#include <stdio.h>#include <stdlib.h>#include <malloc.h>//    定义链表中的节点typedef struct Lnode{    int member;                //    节点中的成员    struct Lnode *pNext;        //    指向下一个节点的指针}LNode, *LinkList;//    函数声明LinkList CreateList();                //    创建链表函数//void TraverseList(LinkList);        //    遍历链表函数void InsertList(LinkList);void DelList(LinkList);void ListLen(LinkList);void ListMid(LinkList);int main(){    LinkList L = NULL;            //    定义初始化头节点,等价于 struct Node *pHead == NULL    int x;    while (1)    {        printf("-------------操作选项-----------\n");        printf("1:生成链表 \n");        printf("2:插入新节点  \n");        printf("3:删除节点   \n");        printf("4:链表长度   \n");        printf("5:链表中间节点值   \n");        printf("--------------------------------\n");        printf("按数字键选择要执行的操作: ");        scanf("%d", &x);        printf("\n");        //输入2跳出循环,退出程序        if (x == 0)            break;        switch (x)        {        case 1:  L=CreateList(); break; //输入1,跳出switch语句,进入下一次循环    //  case 2:  TraverseList(L); break;       //    调用遍历链表函数        case 2:  InsertList(L); break; //输入2,跳出switch语句,进入下一次循环        case 3:  DelList(L); break;        case 4:  ListLen(L); break;        case 5:  ListMid(L); break;        default:  //数字输入错误,跳出siwtch语句,进入下一次循环            printf("输入的数字不正确\n");            break;        }    }    //LinkList L = NULL;            //    定义初始化头节点,等价于 struct Node *pHead == NULL//  L = CreateList();        //    创建一个非循环单链表,并将该链表的头结点的地址付给pHead    //TraverseList(L);        //    调用遍历链表函数    return 0;}//    创建链表函数LinkList CreateList(){    LinkList L;    int n;    LinkList p;    int i;    srand(time(0));    L = (LinkList)malloc(sizeof(LNode));          //  分配一个不存放有效数据的头结点    L->pNext = NULL;    printf("请输入节点个数n:");    scanf("%d", &n);    for (i = 0; i < n; i++)    {        p = (LinkList)malloc(sizeof(LNode));        p->member = rand() % 100 + 1;        p->pNext = L->pNext;        L->pNext = p;    }    LinkList s = L->pNext;                            //将头节点的指针给予临时节点p    while (NULL != s)                                //节点p不为空,循环    {        printf("%d ", s->member);        s = s->pNext;    }    printf("\n");    return L;                                    //返回头节点}/*  遍历链表函数void TraverseList(LinkList L){    LinkList p = L->pNext;                            //将头节点的指针给予临时节点p    while (NULL != p)                                //节点p不为空,循环    {        printf("%d ", p->member);        p = p->pNext;    }    printf("\n");    return 0;}*/void InsertList(LinkList L){    LinkList p,s;    LinkList q = L->pNext;                            //将头节点的指针给予临时节点p    int i,j;    int e;    p = L;    j = 0;    printf("请输入插入的位置i:");    scanf("%d", &i);    printf("请输入插入的节点值e:");    scanf("%d", &e);    while (p&&j<i-1)    {        p = p->pNext;          //寻找第i-1个节点        ++j;    }    if (!p || j>i - 1)        return 0;    s = (LinkList)malloc(sizeof(LNode));    s->member = e; s->pNext = p->pNext;    p->pNext = s;    while (NULL != q)                                //节点p不为空,循环    {        printf("%d ", q->member);        q = q->pNext;    }    printf("\n");    return 1;}void DelList(LinkList L){    LinkList p, s;    LinkList q = L->pNext;                            //将头节点的指针给予临时节点p    int i, j;    int e = 1;    p = L;    j = 0;    printf("请输入想删除的节点i:");    scanf("%d", &i);    while (p&&j<i - 1)    {        p = p->pNext;          //寻找第i-1个节点        ++j;    }    if (!p || j>i - 1)        return 0;    s = p->pNext;    p->pNext = s->pNext;    free(s);    while (NULL != q)                                //节点p不为空,循环    {        printf("%d ", q->member);        q = q->pNext;    }    printf("\n");    return 1;}void ListLen(LinkList L){    LinkList q = L->pNext;                            //将头节点的指针给予临时节点p    int i = 0;    while (NULL != q)                                //节点p不为空,循环    {        i++;        q = q->pNext;    }    printf("链表长度ListLen:%d", i);    printf("\n");    return 1;}void ListMid(LinkList L){    LinkList search, mid;     search = mid = L;    int e;    while (search->pNext != NULL)    {        if (search->pNext->pNext != NULL)        {            search = search->pNext->pNext;            mid = mid->pNext;        }        else {            search = search->pNext;            mid = mid->pNext;        }    }    e = mid->member;    printf("中间节点值为%d", e);}
1 0
原创粉丝点击