单链表的创建以及功能的实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int DataType;
typedef struct node{/*结点类型定义*/
    DataType data;/*结点的数据域*/
    struct node *next;/*结点的指针域*/
}ListNode,*LinkList;
ListNode *p;
LinkList head;
/*注意:定义结点结构时,有几点需要注意:LinkList和ListNode *是不同名字的同一个指针类型,LinkList类型的指针变量head表示他是单链表的头指针,ListNode *类型的指针变量p表示它是指向某一结点的指针*/
LinkList InitList()
{
    LinkList L;
    L=(ListNode*)malloc(sizeof(ListNode));
    if(L==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    L->next=NULL;
    return L;
}
LinkList CreatListF()
{/*头插法建立单链表*/
    DataType x;
    LinkList L;
    ListNode *s;
    L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/
    if(L==NULL)/*检查L是否分配到储存空间*/
    {
        printf("分配空间失败!");
        exit(1); 
    }
    L->next=NULL;
    scanf("%d",&x);
    while(x!=0)
    {
        s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/
        if(s==NULL)
        {
            printf("分配空间失败!");
            exit(1);
        }
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
LinkList CreatListL()
{/*尾插法建立单链表*/
    DataType x;
    LinkList L=(ListNode *)malloc(sizeof(ListNode));/*头结点*/
    if(L==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    ListNode *s,*r;
    r=L;
    scanf("%d",&x);
    while(x!=0)/*以0输入表示结束*/
    {
        s=(ListNode *)malloc(sizeof(ListNode));/*为新插入的结点申请空间*/
        if(s==NULL)
        {
            printf("分配空间失败!");
            exit(1);
        }
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;/*单链表的最后一个指针为空*/
    return L;
}
int GetLength(LinkList L)
{
    int num=0;
    ListNode *p;
    p=L->next;
    while(p!=NULL)
    {
        num++;
        p=p->next;
    }
    return(num);
}
ListNode *GetNode(LinkList L,int i)
{
    int j=1;
    ListNode *p;
    if(i<1||i>GetLength(L))
    {
        printf("查找的位置不正确!");
        exit(1);
    }
    p=L->next;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
int LocateListi(LinkList L,DataType x)
{
    ListNode *p=L->next;
    int i=1;
    while(p!=NULL&&p->data!=x)
    {
        p=p->next;
        i++;
    }
    if(p==NULL)
        return 0;
    else
        return i;
} 
void InsertList(LinkList L,DataType x,int i)
{
    ListNode *p,*q,*s;
    int j=1;
    p=L;
    if(i<1||i>GetLength(L)+1)
    {
        printf("插入位置不正确!");
        exit(1);
    }
    s=(ListNode *)malloc(sizeof(ListNode));
    if(s==NULL)
    {
        printf("分配空间失败!");
        exit(1);
    }
    s->data=x;
        while(j<=i)
        {
            q=p;
            p=p->next;
            j++;
        }
        s->next=p;
        q->next=s;
}
void DeleteList(LinkList L,int i)
{
    ListNode *p,*q;
    int j=1;
    p=L;
    if(i<1||i>GetLength(L))
    {
        printf("删除位置不正确!");
        exit(1);
    }
    while(j<i)
    {
        p=p->next;
        j++;
    }
    q=p->next;
    p->next=q->next;
    free(q);
}
void PrintList(LinkList L)
{
    ListNode *p;
    p=L->next;
    printf("链表元素如下:\n");
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main()
{
    DataType a;
    head=InitList();
    printf("我们将采用头插法创建一个单链表L!\n请输入您要输入的数据(以空格隔开,以0结束!)\n");
    head=CreatListL();
    printf("单链表的长度为:%d\n",GetLength(head));
    printf("请输入您要查找元素的结点序号:");
    scanf("%d",&a);
    printf("第%d个元素为:%d\n",a,GetNode(head,a)->data);
    printf("请输入您要查找的元素:");
    scanf("%d",&a);
    printf("您查找的元素%d在链表中的第%d个位置\n",a,LocateListi(head,a));
    int x,i;
    printf("请输入您要插入元素的数值以及位置:");
    scanf("%d%d",&x,&i);
    InsertList(head,x,i);
    PrintList(head);
    printf("请输入您想要删除元素的位置:");
    scanf("%d",&i);
    DeleteList(head,i);
    PrintList(head);
    return 0;
}

 

posted @ 2018-03-08 11:02  润青  阅读(14009)  评论(0编辑  收藏  举报