1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #define MAX_SIZE 255
    4. typedef struct{//数据域的元素
    5. int id;
    6. char *name;
    7. }ElementType;
    8. typedef struct{
    9. ElementType datas[MAX_SIZE];
    10. int length;
    11. }SeqList;
    12. //定义链表的结点,包含数据域和指针域
    13. typedef struct Node{
    14. ElementType data;//数据域
    15. struct Node *next;//指针域,指向下一个结点
    16. }Node;
    17. /*
    18. 头结点
    19. 注意:我们在定义链表时,习惯性的会定义头结点,以便对链表结点的插入和删除操作比较统一
    20. 头结点也可以称为首元结点,最后一个结点叫做尾元结点
    21. */
    22. typedef struct LinkList{
    23. Node * next;//头指针(如果链表有头结点,next就指向头结点,没有就指向第一个结点)
    24. int length;//链表长度,初始值为0
    25. }LinkList;
    26. //初始化链表
    27. void InitLinkList(LinkList *linkList,ElementType *dataArray,int length);
    28. //在指定的位置pos处插入元素element
    29. void InsertLinkList(LinkList *linkList,int pos,ElementType element);
    30. //打印链表数据
    31. void printLinkList(LinkList *linkList);
    32. //链表是否为空
    33. int IsLinkListEmpty(LinkList *linkList);
    34. //得到这个元素,返回pos位置的元素
    35. ElementType GetLinkListElement(LinkList *linkList,int pos);
    36. //删除并返回指定位置的元素
    37. ElementType DeleteLinkListElement(LinkList *linkList,int pos);
    38. //清空链表
    39. void ClearLinkList(LinkList * linkList);
    #include <iostream>
    using namespace std;
    #include "head.h"
    
    
    //初始化链表
    int i;
    void InitLinkList(LinkList *linkList,ElementType *dataArray,int length){
        for(i=0;i<length;i++){
        InsertLinkList(linkList,i+1,dataArray[i]);
        }
    }
    //在指定的位置pos处插入元素element
    void InsertLinkList(LinkList *linkList,int pos,ElementType element){
        //1.创建空结点并为数据域赋值
        Node *node=(Node *)malloc(sizeof(Node));
        node->data=element;
        node->next =NULL;
    
        //2.找到要插入位置的结点
        if(pos==1){//如果插入的是第一个元素,就很简单
            linkList->next=node;
            linkList->length++;//增加的是头结点的数量
            return ;
        }
        //通过循环找到要插入的结点位置
        Node * currNode=linkList->next;
        for(i=1;currNode &&i<pos-1;i++){
        currNode=currNode->next;//传到要插入位置的前一个结点
        }
        //3.将结点插入并对接前面的结点
    if(currNode){
            node->next=currNode->next;
            currNode->next=node;
            linkList->length++;
        }
    }
    
    //打印链表
    void printLinkList(LinkList *linkList){
    Node *node=linkList->next;
    if(!node){
    printf("链表为空\n");
    linkList->length=0;
    return ;
    }
    for(i=0;i<linkList->length;i++){//下面输出循环没用到i,
    printf("%d\t%s\n",node->data.id,node->data.name);
    node=node->next;
    }
    }
    
    //链表是否为空
    int IsLinkListEmpty(LinkList *linkList){//长度为0,链表为空
    return linkList->length==0 ? true : false;
    }
    
    //得到这个元素,返回pos位置的元素
    ElementType GetLinkListElement(LinkList *linkList,int pos){
        Node *node=linkList->next;
        for(i=1;node && i<pos;i++){//节点不能为空
        node=node->next;
        }
        return node->data;
    }
    
    //删除并返回指定位置的元素
    ElementType DeleteLinkListElement(LinkList *linkList,int pos){
        ElementType element; //被删除的元素
        element.id=-999;  //赋一个不可能的值,用来判断是否删除成功
        Node *node=NULL;
    
        if(pos==1){
        node=linkList->next;
        if(node!=NULL){
        element=node->data;
        linkList->next=node->next;
        free(node);
        linkList->length--;
        }
        return element;
    }
    
        //找到要删除结点和它的前缀结点
        //要删除结点->next赋值给前缀结点->next
        //释放要删除的结点内存
        Node *preNode;
        node=linkList->next;
        for(i=1;node && i<pos;i++){
        preNode=node;
        node=node->next;
        if(node){
        element=node->data;
        preNode->next=node->next;
        free(node);
        linkList->length--;
        }
        }
        return element;
    }
    
    //删除单链表,释放内存空间
    void ClearLinkList(LinkList * linkList){
        Node * node=linkList->next;
        Node *nextNode;
        while(node){
        nextNode=node->next;//先记录当前结点的下一个结点,以便释放当前结点的内存
        free(node);//node被释放,则头结点的下一个指针也被释放掉了。
        node=nextNode;
        }
        linkList->next=NULL;
    }
    
    #include <iostream>
    using namespace std;
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    
    #include "head.h"
    
    
    void TestLinkList();
    
    
    ElementType dataArray[]={
        {1,"12.1"},
        {2,"12.2"},
        {3,"12.3"},
        {4,"12.4"}
    };
    
    void TestLinkList(){
        LinkList linkList;
        linkList.length=0;
        InitLinkList(&linkList,dataArray,sizeof(dataArray)/sizeof(dataArray[0]));
        printf(" 初始化后:\n");
        printLinkList(&linkList);
    
        //在不同位置插入元素
    
        ElementType element;
        element.id=123;
        element.name=(char *)malloc(10);
        strcpy_s(element.name,10,"测试1");
        InsertLinkList(&linkList,2,element);
        printf("插入后:\n");
        printLinkList(&linkList);
    
        //删除
        printf("删除第1个元素后:\n");
        DeleteLinkListElement(&linkList,1);
        printLinkList(&linkList);
    
        printf("清空链表:\n");
        ClearLinkList(&linkList);
        printLinkList(&linkList);
    }
    
    int main(){
        TestLinkList();
        system("pause");
        return 0;
    }