C:数据结构与算法之单链表

单链表相对于顺序表比较难理解,但是比较实用,单链表的插入,删除不需要移动数据元素,只需要一个指针来寻找所需要的元素,还有一个大优点就是不浪费空间,当你想要增加一个结点可以申请(malloc())一个结点的空间,删除一个结点也可以释放(free()),跟顺序表一样的,首先先来定义一个单链表,

1 typedef struct lnode
2 {
3     int data;
4     struct lnode *next;
5 }LNode,*LinkList;

typedef是将类型struct lnode改为LNode,还有指向这个类型的指针*LinkList;,所以当我们创建的每个这样的类型都包含左数据,有指针,创建完单链表,这个表还是空的;先构建单链表并输入数据(逆序输入(表头插入)):

LinkList creatN()
{
    LinkList L,s;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    int x;
    scanf("%d",&x);
    while(x!=-1)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}

正序插入(表尾插入):

LinkList creatZ()
{
    LinkList L,s;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    LinkList p;
    p=L;
    int y;
    scanf("%d",&y);
    while(y!=-1)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=y;
        s->next=NULL;
        p->next=s;
        p=p->next;
        scanf("%d",&y);
    }
    return L;
}

输出函数:

int print(LinkList L)
{
    LinkList p=L->next;
    while(p!=NULL)
    {
    printf("|%d|",p->data);
    p=p->next;
    }
    printf("\n");
    printf("请继续使用,请输入0~8的数字:\n");
}

接下来弄一个表格把所有函数都实现:,

#include "stdio.h"
typedef struct lnode
{
    int data;
    struct lnode *next;
}LNode,*LinkList;/* */
LinkList creatN();
LinkList creatZ();
void ShowMainWindow();
int print(LinkList L);
int addbiaowei(LinkList L,int x);
int addbiaotou(LinkList L,int x);
int deletbiaowei(LinkList L);
int deletbiaotou(LinkList L);
int findmax(LinkList L);
int findreplace(LinkList L,int i,int x);
main()
{
    printf("正序插入请按扣z(否则为逆序插入):");
    LinkList L;
    char a;
    scanf("%c",&a);
    if(a=='z')
    {
    printf("请输入数据并以-1为结尾:\n");
    L=creatZ();
    }
    else
    {
        printf("请输入数据并以-1为结尾:\n");
        L=creatN();
        }
    system("cls");
    ShowMainWindow();
    printf("请输入0~8的数字:\n");
    while(1)
    {
    int num;
    scanf("%d",&num);
    if(num==1)
    {
    printf("%请输入你想要在表尾增加的数据:\n");
    int y;
    scanf("%d",&y);
    addbiaowei(L,y);
    }
    else
    if(num==2)
    {
    printf("请输入你想要在表头增加的数据:\n");
    int y;
    scanf("%d",&y);
    addbiaotou(L,y);
    }
    else
    if(num==3)
    {
    deletbiaowei(L);
    }
    else
    if(num==4)
    {
    deletbiaotou(L);
    }
    else
      if(num==5)
{
    int max;
    max=findmax(L);
    printf("最大值为:%d\n请继续使用,请输入0~8的数字:\n",max);
}
else
if(num==6)
{
    printf("请输入你要查找的元素,并且返回元素所在的位置!:");
    int x;
    scanf("%d",&x);
    LinkList p=L->next->next;
    int j=1;
    while(p->next!=NULL)
    {
        if(p->data==x)
        printf("此元素在%d个位置\n",j);
        j++;
        p=p->next;
    }
    printf("请输入0~8的数字:\n");
}

else
if(num==7)
{
    printf("请输入你要的替换的位置和元素!:\n");
    int i,x;
    scanf("%d,%d",&i,&x);
    findreplace(L,i,x);
}

else
if(num==8)
{
    printf("此表的数据为:");
    print(L);
}
else
    if(num==0)
    break;
    }
    printf("%d",L->next->data);
}
void ShowMainWindow()
{
    printf("\n\n\t+-----------------------------------------------------+\n");
    printf("\t|                   单链表练习                        |\n");
    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");
    printf("\t|------------------- 7.替换元素-----------------------|\n");
    printf("\t|------------------- 8.打印表-------------------------|\n");
    printf("\t|------------------- 0.退出系统-----------------------|\n");
    printf("\t+-----------------------------------------------------+\n");
    printf("\t|               请输入您的选择(0-5)                   |\n");
    printf("\t+-----------------------------------------------------+\n");
    printf("\n\n");
    }
LinkList creatN()
{
    LinkList L,s;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    int x;
    scanf("%d",&x);
    while(x!=-1)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
LinkList creatZ()
{
    LinkList L,s;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    LinkList p;
    p=L;
    int y;
    scanf("%d",&y);
    while(y!=-1)
    {
        s=(LinkList)malloc(sizeof(LNode));
        s->data=y;
        s->next=NULL;
        p->next=s;
        p=p->next;
        scanf("%d",&y);
    }
    return L;
}
int addbiaowei(LinkList L,int x)
{
    LinkList p=L;
    LinkList s;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    s=(LinkList)malloc(sizeof(LNode));
    s->data=x;
    p->next=s;
    s->next=NULL;
    printf("在表尾添加成功,查看请按8!\n");
}
int addbiaotou(LinkList L,int x)
{
        LinkList s;
        s=(LinkList)malloc(sizeof(LNode));
        s->data=x;
        s->next=L->next;
        L->next=s;
        printf("在表头添加成功,查看请按8!\n");
}
int deletbiaowei(LinkList L)
{
    LinkList p=L;
    LinkList s;
    while(p->next->next!=NULL)
    {
        p=p->next;
    }
    p->next=NULL;
    free(p->next);
    printf("表尾删除成功,查看请按8!\n");
}
int deletbiaotou(LinkList L)
{
    LinkList p=L->next;
    L->next=p->next;
    p->next=NULL;
    free(p->next);
    printf("表头删除成功,查看请按8!\n");
}
int findmax(LinkList L)
{
    int max;
    LinkList p=L->next;
    max=p->data;
    while(p->next!=NULL)
    {
        p=p->next;
        if(max<p->data)
        max=p->data;
        }
    return max;
    }
int print(LinkList L)
{
    LinkList p=L->next;
    while(p!=NULL)
    {
    printf("|%d|",p->data);
    p=p->next;
    }
    printf("\n");
    printf("请继续使用,请输入0~8的数字:\n");
}
    int findreplace(LinkList L,int i,int x)
{
    LinkList p=L->next;
    int j=0;
    while(p->next!=NULL&&j<i-1)
    {
        j++;
        p=p->next;
    }
    p->data=x;
    printf("替换成功,查看请按8!:\n");
}

这就是一个完整的单链表,函数功能可以自己复制运行试一试。

posted @ 2016-04-06 17:33  await  阅读(302)  评论(0编辑  收藏  举报