C语言程序设计(单链表的基本操作)

C语言程序设计(单链表的基本操作)

问题描述:

用结构体和指针实现一个单链表的基本操作程序link.c,主要包括以下功能模块:
1.系统菜单模块设计(MenuLine() )。为了在主函数(main())反复执行上图图1单链表子系统的各操作函数,我们在主函数中用循环语句实现此功能,并设计了一个菜单显示各功能选项,用函数MenuLine() 表示
2.单链表的类型定义(typedef struct linknode )。
typedef int DataType; /定义DataType为int类型/
typedef struct linknode /单链表存储类型/
{
DataType data; /定义结点的数据域/
struct linknode *next; /定义结点的指针域/
} LinkList;
3.单链表的初始化(LinkList *InitList())。
LinkList *InitList()
{ /初始化链表函数/
LinkList head;
head=(LinkList
)malloc(sizeof(LinkList)); /动态分配一个结点空间/
head->next=NULL;
return head; /头结点L指针域为空,表示空链表/
}
4.显示输出链表函数(void DispList(LinkList *head))。
5.建立链表函数( void CreateList(LinkList *head,int n)),要求建立后显示输出链表。
6.按位置插入元素函数(void InsList(LinkList *head, int i, DataType x)),要求插入后显示输出链表。。
(7)按位置删除链表中元素函数(void DelList(LinkList *head,int i)),要求删除后显示输出链表。
(8)在链表中按位置查找元素(void SearchList(LinkList *head,int i))。
(9)在链表中查找值为x的元素位置(Locate(void LinkList *head,DataType x))。
(10)求链表长度函数(int LengthList(LinkList *head))。
软件:Visual C++ 6.0

如下:
search函数和locate函数你在main函数中调用一下就可以了。

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

typedef int DataType; /*定义DataType为int类型*/
typedef struct linknode  
{
    DataType data;
    struct linknode * next;
}LinkList;
//创建线性表
LinkList * CreateList()
{
    int i,n;
    struct linknode * head,*p,*t;
    head = (struct linknode *)malloc(sizeof(linknode ));
    head->next = NULL;
    t = head;
    printf("请输入链表的长度:");
    scanf("%d",&n);
    printf("请输入链表数据:");
    for (i=0;i<n;i++)
    {
        p = (struct linknode *)malloc(sizeof(linknode ));
        scanf("%d",&(p->data));
        p->next = NULL;
        t->next = p;
        t = p;
    }
    return head;
}

int LengthList(LinkList *head)
{
    LinkList* p ;
    int len =  0;
    if (head == 0)
    {
        return 0;
    }
    p = head->next;
    while (p)
    {
        len++;
        p = p->next;
    }
    return len;
}


//插入
LinkList * InsList(LinkList *head,int pos,DataType data)
{
    struct linknode * p = head,*t;
    int i=1;
    if(pos <1 || pos > LengthList(head))
    {
        printf("插入位置错误");
        return head;
    }
    while(i<pos && p)
    {
        p = p->next;
        i++;
    }
    if (p)
    {
        t = (struct linknode *)malloc(sizeof(linknode ));
        t->data = data;
        t->next = p->next;
        p->next = t;
        printf("插入成功\n");
    }else
        printf("插入位置不合适,插入失败\n");

    return head;
}

//删除
LinkList * DelList(LinkList* head,int pos)
{
    int i = 1;
    struct linknode * p = head,*t;
    if (pos < 0 || pos > LengthList(head))
    {
        printf("删除位置错误");
        return head;
    }
    while(i<pos && p)
    {
        p = p->next;
        i++;
    }
    if (p)
    {
        t = p->next;
        p->next = t->next;
        free(t);
        t = 0;
        printf("删除成功\n");
    }else
        printf("删除成功\n");
    return head;
}


//显示
void DispList(LinkList * head)
{
    struct linknode * p = head->next;
    while(p)
    {
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}


//在链表中按位置查找元素
void SearchList(LinkList *head,int pos)
{
    LinkList* p;
    int i = 1;
    if (p<0 || pos > LengthList(head))
    {
        printf("位置错误");
        return;
    }
    p = head->next;
    while (p && i!= pos)
    {
        p = p->next;
        i++;
    }
    if(p)
    {
        printf("查找到的数据为:%d\n",p->data);
    }else
        printf("未找到\n");
}


//查找位置

void Locate(LinkList *head,DataType x)
{
    LinkList* p;
    int i=1;
    if(head == 0)
    {
        printf("链表为空\n");
        return ;
    }
    p = p->next;
    while(p)
    {
        if (p->data == x)
        {
            printf("%d所在位置:%d\n",x,i);
            return ;
        }else
        {
            i++;
            p = p->next;
        }
    }
    printf("未找到该元素\n");
    return ;
}



//释放空间
void Free(LinkList * head)
{
    struct linknode * p;
    while(head)
    {
        p = head->next;
        free(head);
        head = p;
    }
    head = 0;
}

int main()
{
    int pos,data;
    struct linknode * head = CreateList();
    DispList(head);

    //插入
    printf("请输入插入位置(从1开始)和数据:");
    scanf("%d %d",&pos,&data);
    head = InsList(head,pos,data);
    printf("插入后链表数据:");
    DispList(head);

    //删除
    printf("请输入删除位置(从1开始):");
    scanf("%d",&pos);
    head = DelList(head,pos);
    printf("删除后链表数据:");
    DispList(head);

    //释放空间
    Free(head);
    return 0;
}