关于链表的问题,写代码。

链表的建立、插入、删除、查找等操作(按给定值进行查找);

参考如下:


#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct node 
{
    ElemType data;
    struct node* next;
}SlinkNode;

//1初始化链表
SlinkNode* InitLink(SlinkNode* h)
{
    h = (SlinkNode*) malloc(sizeof(SlinkNode));
    h->next = NULL;
    return h;
}

//2尾插法
SlinkNode* InsertLinkTail(SlinkNode* h,ElemType e)
{
    SlinkNode* p=h->next;
    SlinkNode* t = (SlinkNode*)malloc(sizeof(SlinkNode));
    t->data = e;
    t->next = NULL;
    if(p==NULL) 
        h->next = t;
    else
    {
        while (p->next)
        {
            p = p->next;
        }
        p->next = t;
    }
    return h;
}
//3显示链表
void showList(SlinkNode* h)
{
    SlinkNode* p = h->next;
    while (p)
    {
        printf("%c ",p->data);
        p = p->next;
    }
    printf("\n");
}

//4.头插法
SlinkNode* InsertHead(SlinkNode* h,ElemType e)
{
    SlinkNode *t;
    t = (SlinkNode*)malloc(sizeof(SlinkNode));
    t->data = e;
    t->next = h->next;
    h->next = t;
    return h;
}
//5.链表的长度
int Length(SlinkNode* h)
{
    SlinkNode* p = h->next;
    int len=0;
    while(p)
    {
        len++;
        p = p->next;
    }
    return len;
}

//6.获取pos位置处的元素
int GetElement(SlinkNode* h,int pos,ElemType* e)
{
    SlinkNode* p = h->next;
    if(pos <1 || pos > Length(h) ) return 0;
    while(--pos)
    {
        p = p->next;
    }
    if(p) 
    {
        *e = p->data;
        return 1;
    }
    return 0;
}

//7.获取第一个元素e的位置
int GetElePos(SlinkNode* h,ElemType e)
{
    SlinkNode* p = h->next;
    int i = 1;
    while(p)
    {
        if(p->data == e) return i;
        i++;
        p = p->next;
    }
    return 0; //没找到返回0
}

//8.在pos位置插入元素
SlinkNode* InsertAt(SlinkNode* h,int pos,ElemType e)
{
    SlinkNode* p,*t;
    if (pos <1 || pos > Length(h))
    {
        return 0;
    }
    t = (SlinkNode*)malloc(sizeof(SlinkNode));
    t->data = e;
    p = h;
    while(--pos && p)
    {
        p = p->next;
    }
    if(p) 
    {
        t->next = p->next;
        p->next = t;    
    }
    return h;
}

//10.删除pos位置的元素
SlinkNode* DeleteEleAt(SlinkNode* h,int pos)
{
    SlinkNode* p,*t;
    if (pos<1 || pos >Length(h))
    {
        return h;
    }
    p = h;
    t = p->next;
    while(--pos && t)
    {
        p = t;
        t = t->next;
    }
    p->next = t->next;
    free(t);
    t = 0;
    return h;

}

void FreeList(SlinkNode* h)
{
    SlinkNode* p;
    while(h)
    {
        p = h->next;
        free(h);h=0;
        h = p;
    }
}

int main()
{
    SlinkNode* h = 0;
    int i;
    ElemType ch;
    char zm[]={'a','b','c','d','e'};
    char sz[]={'1','2','3'};
    //初始化单链表h
    h = InitLink(h);
    //尾插法插入
    for(i=0;i<5;i++)
        h = InsertLinkTail(h,zm[i]);
    //输出单链表
    showList(h);
    //头插法插入1 2 3
    for(i=0;i<3;i++)
        h = InsertHead(h,sz[i]);

    printf("链表长度:%d\n",Length(h));
    printf("显示链表:");
    showList(h);

    //显示序号为3的元素
    GetElement(h,3,&ch);
    printf("序号为3的元素:%c\n",ch);

    //'a'的位置
    i = GetElePos(h,'a');
    printf("a的位置:%d\n",i);

    //在第4位置插入*
    h = InsertAt(h,4,'*');

    //显示链表
    printf("在第4个位置插入*后链表数据:");
    showList(h);

    //删除第3个元素
    h = DeleteEleAt(h,3);
    //显示链表
    printf("删除第3个元素后链表数据:");
    showList(h);
    //释放链表
    FreeList(h);
    return 0;

}