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

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

 

#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;
}

运行结果:

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

 

 

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

 

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

 

 

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

上一篇:LDAP服务部署


下一篇:剑指offer-删除链表中重复的结点