單鏈表的建立以及功能的實現

#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;
}
相關文章
相關標籤/搜索