无表头单链表增删改查操作

1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0
2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0
3、向单链表的表头插入一个元素
4、向单链表的末尾添加一个元素

5、向单链表中第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0

6、向有序单链表中插入元素x结点,使得插入后仍然有序

7、从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
8、从单链表中删除表尾结点并返回它的值,若删除失败则返回0

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

typedef int Element;
//定义节点结构
struct node
{
    Element data;    //数据域
    struct node *next;//指针域
};

typedef struct node LinkNode;
//创建单链表--不带头节点
LinkNode * createLinkList();
LinkNode * createLinkList()
{
    LinkNode *head = NULL;  //
    LinkNode *tail = NULL;  //
    LinkNode *temp = NULL;  //临时的节点,指向当前创建的元素
    
    int data;
    scanf("%d",&data);
    
    while (data)
    {
        temp = (LinkNode *)malloc(sizeof(LinkNode));    //temp指向该申请内存,下一次temp指向一个新的内存
        
        if (!temp)          //申请失败
        {
            printf("malloc failed.....");
        }
        else                         //申请成功
        {
            temp->data = data;       //写入数据到temp数据域中
            temp->next = NULL;       //写入数据到temp指针域中
        }
        
        
        if (head == NULL)           //头为空的时候
        {
            head = temp;            //头指针指向temp
            tail = temp;            //尾指针指向temp
        }
        else                        //头不为空的时候
        {
            tail->next = temp;      //将temp赋给指针域,下一次作next域连上data域
            tail = temp;            //尾指针指向temp
        }
        
        scanf("%d",&data);//接着输入下一个值,输入0就结束
    }
    
    return head;
}

//输出单链表
void printLinkList(LinkNode *head);
void printLinkList(LinkNode *head)
{
    LinkNode *p = head;
    while (p)
    {
        printf("%d	",p->data);
        p = p->next;
    }
}

//求链表长度
int length(LinkNode *head);
int length(LinkNode *head)
{
    int len = 0;
    LinkNode *p = head;
    
    while (p)
    {
        len++;
        p = p->next;
    }
    
    return len;
}
//1

int modifyElement(LinkNode *head,int pop,int newElement);
int modifyElement(LinkNode *head,int pop,int newElement)
{
    int succss = 0;
    if (pop <= 0 || pop > length(head))
    {
        printf("oops:pos is invalid");
        return succss;
    }
    
    LinkNode *p = head;
    for (int i = 0; i < pop - 1; i++)
    {
        p = p->next;
    }
    
    if (p)
    {
        p ->data = newElement;
        succss = 1;
    }
    return succss;
}

//2(重点)
int insertElementToHead(LinkNode **head,Element e);
int insertElementToHead(LinkNode **head,Element e)
{
    int success = 0;
    LinkNode *tmp = NULL;
    
    if (e)
    {
        tmp = (LinkNode *)malloc(sizeof(LinkNode));
        tmp->data = e;
        tmp->next = NULL;
    }
    else
    {
        printf("zero is invalid");
        return 0;
    }
    
    //通过指针修改(重点)
    tmp->next = *head;   //连接
    *head = tmp;          //修改地址
    
    return success;
}

//3
int insertElementToEnd(LinkNode *head,Element e);
int insertElementToEnd(LinkNode *head,Element e)
{
    int success = 0;
    LinkNode *p = head;
    LinkNode *tmp = NULL;
    if(e)
    {
        tmp = (LinkNode *)malloc(sizeof(LinkNode));
        tmp->data = e;
        tmp->next = NULL;
    }
    else
    {
        printf("zero is invalid");
        return 0;
    }
    
    while (p && p->next) {
        p = p->next;
    }
    
    p->next = tmp;
    return success;
}

int insertElementToPos(LinkNode *head,Element e,int pos);
int insertElementToPos(LinkNode *head,Element e,int pos)
{
    int success = 0;
    LinkNode *p = head;
    LinkNode *tmp = NULL;
    if (pos <= 0 && pos >length(head))
    {
        return success;
    }
    
    for (int i = 0; i < pos -2; i++) {
        p = p->next;
    }
    
    tmp = (LinkNode *)malloc(sizeof(LinkNode));
    tmp->data = e;
    tmp->next = NULL;
    
    if (p)
    {
        tmp->next = p->next;
        p->next = tmp;
        success = 1;
    }
    return success;
}

int insertOrderLinkList(LinkNode *head,Element x);
int insertOrderLinkList(LinkNode *head,Element x)
{
    int success = 0;
    
    LinkNode *p = head;
    int loc = 1;
    while (p)
    {
        if(p->data < x)
        {
            p = p->next;
            loc++;
        }
        else
        {
            break;
        }
    }
    
    //此处还要分3种情况头尾中间
    success = insertElementToPos(head,x,loc);
    
    return success;
}

int deleteHeadNode(LinkNode **head);
int deleteHeadNode(LinkNode **head)
{
    int data = 0;
    LinkNode *p = *head;
    data = p->data;
    
    *head = p->next;
    
    return data;
    
}

int deleteEndNode(LinkNode *head);
int deleteEndNode(LinkNode *head)
{
    LinkNode *p = head;
    LinkNode *q = NULL;
    int data = 0;
    for (int i = 0; i < length(head) - 2 ; i++)
    {
        p = p->next;
    }
    
    q = p->next;
    data = q->data;
    p->next = NULL;
    free(q);
    
    return data;
}

int main(int argc, const char * argv[])
{
    LinkNode *head = NULL;
    head=createLinkList();
    
    printLinkList(head);
    printf("len = %d
",length(head));
    
    /*
    //1
    modifyElement(head,2,54);
    printLinkList(head);
    printf("
");
    
    insertElementToHead(&head,90);//
    printLinkList(head);
    printf("
");
    
    insertElementToEnd(head,70);
    printLinkList(head);
    printf("
");
    
    insertElementToPos(head,100,3);
    printLinkList(head);
    printf("
");
*/
    
    insertOrderLinkList(head,23);//此时需表是有序的,输入10到50内数
    printLinkList(head);
    printf("
");
    
    deleteHeadNode(&head);
    printLinkList(head);
    printf("
");

    deleteEndNode(head);
    printLinkList(head);

    return 0;
}
原文地址:https://www.cnblogs.com/huen/p/3497532.html