无表头单链表

单链表=动态内存分配+结构体+指针

单链表即单元上非连续的存储结构,有数据域和指针(地址)域。

好处:增大内存利用率,可以将各个小内存连接起来供大内存程序使用。

表头唯一代表这一个单链表。

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

typedef int Element;  //修改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;
}

int main(int argc, const char * argv[])
{
    LinkNode *head = NULL;
    head=createLinkList();
    
    printLinkList(head);
    printf("len = %d
",length(head));
    

       return 0;
}

 

 1ex

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

typedef int Element;

struct node
{
    Element data;
    struct node *next;
};

typedef struct node lNode;

//创建链表
lNode * createLinkList();
lNode * createLinkList()
{
    lNode *head = NULL;
    lNode *tail = NULL;
    lNode *temp = NULL;
    
    int data;
    scanf("%d",&data);
    
    while (data)
    {
        temp = (lNode *)malloc(sizeof(lNode));
        
        if (!temp)
        {
            printf("没内存");
        }
        else
        {
            temp->data = data;
            temp->next = NULL;
        }
        
        if (head == NULL)
        {
            head = temp;
            tail = temp;
        }
        else
        {
            tail->next = temp;
            tail = temp;
        }
        scanf("%d",&data);
    }
    return head;
}
//输出单链表
void printLinkList(lNode *head);
void printLinkList(lNode *head)
{
    lNode *p = head;
    while (p) {
        printf("%d	",p->data);
        p = p->next;
    }
}

//求链表长度
int len(lNode *head);
int len(lNode *head)
{
    int len = 0;
    lNode *p = head;
    while (p)
    {
        len++;
        p = p->next;
    }
    return len;
}
//把单链表中第3个结点的值修改为x的值,若修改成功返回1,否则返回0
bool update(lNode *head);
bool update(lNode *head)
{
    bool flag = false;
    int len = 0;
    lNode *p = head;
    while (len < 2)
    {
        len++;
        p = p->next;
    }
    p->data = 15;
    flag = 1;
    return flag;
}
//向单链表的表头插入一个元素
lNode *insertE(lNode *head);        //因为表头改变了所以需要返回表头
lNode *insertE(lNode *head)
{
    int data;
    printf("请输入要加入的数
");
    scanf("%d",&data);
    lNode *temp = NULL;
    lNode *p = head;
    p = head;
    temp = (lNode *)malloc(sizeof(lNode));
    temp->data = data;
    temp->next = p;

    p = temp;
    return p;
    
}

// 向单链表的末尾添加一个元素
void insertEtoTail(lNode *head);    //表头没改变,不过返回数据类型为空时最好在该函数内输出。
void insertEtoTail(lNode *head)
{
    int data;
    printf("请输入要加入的数
");
    scanf("%d",&data);
    lNode *temp = NULL;
    lNode *p = head;
    temp = (lNode *)malloc(sizeof(lNode));
    temp->data = data;
    temp->next = NULL;
    
    int length = len(head);
    p = head;
    for(int i = 0;i < length - 1;i++)
    {
        p = p->next;
    }
    p->next = temp;
    p = temp;
    
}
//向单链表中第pos2个结点位置hou插入元素为x的结点,若插入成功返回1,否则返回0
lNode *insertEtoX(lNode *head);
lNode *insertEtoX(lNode *head)
{
    int len = 0;
    lNode *p = head;
    lNode *n = NULL;
    lNode *temp = (lNode *)malloc(sizeof(lNode));
    temp->data = 67;
    temp->next = NULL;
    while (len < 1)
    {
        len++;
        p = p->next;
    }
    n = p->next;
    p->next = temp;
    temp->next = n;
    
    return head;
}
//从单链表中删除表头结点,并把该结点的值返回,若删除失败则返回0
int deleteTop(lNode *head);
int deleteTop(lNode *head)
{
    lNode *p = head;
    head = p->next;
    printLinkList(head);
    printf("len = %d
",len(head));
    
    return p->data;
}
//从单链表中删除表尾结点并返回它的值,若删除失败则返回0
int deleteTail(lNode *head);
int deleteTail(lNode *head)
{
    lNode *p = head;
    int length = len(head);
    p = head;
    for(int i = 0;i < length - 1;i++)
    {
        p = p->next;
    }
    int last = p->data;
    
    p = head;
    for(int i = 0;i < length - 2;i++)
    {
        p = p->next;
    }
    p->next = NULL;
    printLinkList(head);
    printf("len = %d
",len(head));
    return last;
}

int main(int argc, const char * argv[])
{
    lNode *p = NULL;
    p = createLinkList();
    printLinkList(p);
    printf("len = %d
",len(p));
    
    //printf("修改%d
",update(p));
    //printLinkList(p);
    
//    lNode *a =NULL;
//    a=insertE(p);
//    printLinkList(a);
//    printf("len = %d
",len(a));
    
//    insertEtoTail(p);
//    printLinkList(p);
//    printf("len = %d
",len(p));
    
//    lNode *x =NULL;
//    x = insertEtoX(p);
//    printLinkList(x);
//    printf("len = %d
",len(x));

//    printf("第一个值为%d
",deleteTop(p));
    
    printf("最后一个值为%d
",deleteTail(p));
    return 0;
}

1、返回单链表中第pos个结点中的元素,若pos超出范围,则返回0

2、把单链表中第pos个结点的值修改为x的值,若修改成功返回1,否则返回0

3、向单链表的表头插入一个元素 

4、向单链表的末尾添加一个元素 

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

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

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

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

原文地址:https://www.cnblogs.com/huen/p/3494648.html