数据结构考研复习(单链表)

  复习资料上有部分内容存在问题,我自己改写了一些细枝末节的东西,整理后最终代码如下:

 

#include<stdio.h>
#include<malloc.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode, *LinkList;

/* -1- 头插法建立单链表*/
LinkList List_HeadInsert(LinkList &L){
    LNode *temp;//中间结点
    int x;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    while(x!=9999){
        scanf("%d",&x);
        temp = (LNode*)malloc(sizeof(LNode));
        temp-> data = x;
        temp->next = L->next;
        L->next = temp;
}
    return L;
}


/* -2- 尾插法建立单链表*/
LinkList List_TailInsert(LinkList &L){
    int x;
    L = (LinkList)malloc(sizeof(LNode));
    LNode *temp, *t = L;//t为表尾指针
    while(x!=9999){

        temp = (LNode*)malloc(sizeof(LNode));
        temp->data = x;
        t->next = temp;
        t = temp;
        scanf("%d",&x);
}
    t->next = NULL;//尾结点指针置空
    return L;
}

/* -3- 获取单链表中的元素*/
int Get_Element(LinkList &L){
    LNode *temp = L->next;
    while(temp->next){
        temp = temp->next;
        printf("%d ",temp->data);
}
    printf("\n");
}

/* -4- 按序号查找结点值*/
LNode *Find_Element(LinkList L,int i){
    int j = 1;//计数
    LNode *temp = L->next;//头结点指针赋给temp
    if(i==0)
    {
        return L;//返回头结点
    }
    if(i<0)
    {
        printf("访问位置不合法!");
    }
    else{
        while(temp && j < i+1){
            temp = temp->next;
            j++;
    }
    return temp;
}
}

/* -5- 按值查找表结点*/
int Locate_Element(LinkList L,int i){
    LNode *temp = L->next;
    int m = 0;
    while(temp && temp->data != i){
        temp = temp->next;
        m++;
}
    return m;
}

/* -6- 插入结点(后插)*/
LNode *Insert_Element1(LinkList L,int i,int e){
    LNode *previous = L->next;
    int m = 0;
    while(previous && m<i){
        previous = previous->next;
        m++;
}
    LNode *temp = (LinkList)malloc(sizeof(LNode));
    temp->data = e;
    temp->next = previous->next;
    previous->next = temp;
    return L;
}

/* -7- 插入结点(前插)*/
LNode *Insert_Element2(LinkList L,int i,int e){
    i--;
    Insert_Element1(L,i,e);
    return L;
}

/* -8- 删除结点*/
LNode *Delete_Element(LinkList L,int i){
    LNode *previous = L->next;
    int m = 1;
    while(previous && m<i){
        previous = previous->next;
        m++;
}
    LNode *del_elem = previous->next;
    previous->next = previous->next->next;
    free(del_elem);
    return L;
}

/* -9- 求单链表长度*/
int length_list(LinkList L){
    LNode *temp = L->next;
    int m = 0;
    while(temp){
        temp = temp->next;
        m++;
}
    return m;
}


int main(){

    LinkList L;

    printf("\t请对单链表建立方式进行选择:\n");
    printf("\t==1.头插法\n");
    printf("\t==2.尾插法\n");
    int flag;
    scanf("%d",&flag);
    switch(flag)
    {
    case(1):
        {
            printf("\t请依次输入数据:\n\t");
            printf("====================\n");
            List_HeadInsert(L);
            Get_Element(L);
            break;
        }
    case(2):
        {
            printf("\t请依次输入数据:\n\t");
            printf("====================\n");
            List_TailInsert(L);
            Get_Element(L);
            break;
        }
    }
    printf("\t*****请进行选择:\n");
    printf("\t==1.按序号查找结点值==\n");
    printf("\t==2.按值查找表结点==\n");
    printf("\t==3.在指定序列 后 插入元素==\n");
    printf("\t==4.在指定序列 前 插入元素==\n");
    printf("\t==5.删除指定序列的元素==\n");
    printf("\t==6.求单链表元素个数==\n");
    int selection;
    scanf("%d",&selection);
    switch(selection)
    {
    case(1):
        {
            printf("\t请输入要查询的序号:\n");
            int m;
            scanf("%d",&m);
            LNode *temp = Find_Element(L,m);
            printf("在单链表中第 %d 个结点的值为 %d ",m,temp->data);
            break;
        }
    case(2):
        {
            printf("\t请输入要查找的结点:\n");
            int m;
            scanf("%d",&m);
            int temp = Locate_Element(L,m);
            printf("值为 %d 的结点所在的位置是单链表的第 %d 个",m,temp);
            break;
        }
    case(3):
        {
            printf("\t请输入要插入元素的序列:\n");
            int m;
            scanf("%d",&m);
            printf("\t请输入要插入的元素值:\n");
            int e;
            scanf("%d",&e);
            Insert_Element1(L,m,e);
            Get_Element(L);
            break;
        }
    case(4):
        {
            printf("\t请输入要插入元素的序列:\n");
            int m;
            scanf("%d",&m);
            printf("\t请输入要插入的元素值:\n");
            int e;
            scanf("%d",&e);
            Insert_Element2(L,m,e);
            Get_Element(L);
            break;
        }
    case(5):
        {
            printf("\t请输入要删除的元素序列:\n");
            int m;
            scanf("%d",&m);
            Delete_Element(L,m);
            Get_Element(L);
            break;
        }
    case(6):
        {
            int length = length_list(L);
            printf("单链表中元素个数为【%d】",length-1);
        }
    }

 return 0;
}

 

 

 

运行结果:

posted on 2021-07-31 20:26  HOr7z  阅读(56)  评论(0编辑  收藏  举报