单链表

来源:互联网 发布:qq影像官方下载 mac 编辑:程序博客网 时间:2024/06/05 10:33

程序构思:

1.单链表的建立

(1)先家里头结点head,将头结点的指针域置为空。

(2)新建一个指向头结点的指针m,即Node *m = head;(首端插入方式不需要该步骤)。

(3)新建一个结点p,把此新结点链接到单链表的尾端(p->next设为空)或者始端。

      1⃣️首端插入方式

      ①p->next指向头结点指向的下一个结点head->next。

      ②head->next指向p。

      2⃣️尾端插入方式。

     ①m->next指向p,即m->next = p;

     ②把指针p赋值给m,也就是说每次m都要最终指向新插入的结点。m = p;

2.单链表的插入

(1)新建一个结点p,指定插入位置。

(2)从单链表开始查找结点位置。

      ①找到该位置,则p->next指向当前位置的下一个结点,当前位置结点指向新建结点p。

      ②没有找到该位置,插入操作失败。

3.单链表的删除

(1)指定删除位置。

(2)从单链表头开始找到结点位置。

       ①找到该位置,则删除该位置的结点。

       ②没有找到该位置,删除操作失败。

#include <iostream>#include <stdlib.h>#include <cstdio>using namespace std;typedef int ElementType;    //指定单链表中数据类型//单链表存储结构定义typedef struct Node{    ElementType data;  //数据域    struct Node *next; //指针域}*LinkList;#pragma mark - 建立一个空线性表/单链表(方法一)/****----------------------------------------------****///单链表建立方法一(函数用返回值得到表头指针)//函数名: CreateOne(int n)//参数:  (传入)int n, 传入线性表结点数量//作用: 建立一个空线性表//返回值:Node *型返回结构体指针,即得到建立的线性表头指针/****---------------------------------------------****/Node* CreateOne(int n){    int i;    Node *head;  //定义头结点指针    Node *p;     //定义新结点指针        //建立带头结点的线性链表    head = (Node*)malloc(sizeof(Node));    head->next = NULL;        cout << "Please input the data for LinkList Nodes:" << endl;        /** 该链表创建并初始化采用的是从表尾插入n个元素,比如如果输入的是:1 2 3,那么输出链表时会输出3 2 1 */    /*    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一个新结点        scanf("%d", &p->data);  //新结点赋值        //新结点插入到表头        p->next = head->next;        head->next = p;    }     */        /** 该链表创建并初始化采用的是从表头插入n个元素,比如输入的是:1 2 3, 那么输出的顺序也是会: 1 2 3 */    Node *tempNode = head;    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一个新结点        scanf("%d", &p->data);  //新结点赋值        //新结点插入到表尾        tempNode->next = p;        tempNode = p;    }    tempNode->next = NULL;    return head;   //返回头结点指针,即可以得到单链表的地址}#pragma mark - 建立一个空线性表/单链表(方法二)/****----------------------------------------------****///单链表建立方法二(函数无返回值)//函数名: CreateTwo(Node* head, int n)//参数: (传入)Node* head传入一个链表指针//     (传入)int n,传入线性表结点数量//作用: 建立一个空线性表//返回值: 无/****---------------------------------------------****/void CreateTwo(Node *head, int n){    int i;    Node *p;   //定义新结点指针        //建立带头结点的线性链表    head = (LinkList)malloc(sizeof(Node));    head->next = NULL;        cout << "Please input the data for LinkList Nodes:" << endl;    for (i = n; i > 0; i--) {        p = (Node*)malloc(sizeof(Node));   //为新结点申请空间,即创建一新结点        scanf("%d", &p->data);   //为新结点赋值                //新结点插入到表头        p->next = head->next;        head->next = p;    }}#pragma mark - 向单链表中插入一个元素/****----------------------------------------------****///函数名: InsertNode(Node *L, int i, ELementType e)//参数: (传入)Node *L,传入线性表头指针L//     (传入)int i插入位置//     (传入)ELementType e插入元素//作用: 线性表中插入一个元素//返回值: int型,返回1表示操作成功,0表示失败/****---------------------------------------------****/int InsertNode(Node *L, int i, ElementType e){    Node *p = L;   //定义一个指向第一个结点的指针    int j = 0;        //顺指针向后查找, 直到p指向第一个结点    while (p && j < i) {        p = p->next;        j++;    }        //插入位置合法性判断    if (!p || j > i) {        cout << "Error! The location is illegal!"  << endl;        return 0;    }        Node *s;    s = (Node*)malloc(sizeof(Node));   //建立新结点    s->data = e;    //新结点赋值        //插入结点    s->next = p->next;    p->next = s;    return 1;}#pragma mark - 删除单链表中的一个元素/****----------------------------------------------****///函数名: DeleteNode(LinkList &L, int i, ELementType &e)//参数: (传入)LinkList &L,线性表头指针L的地址//     (传入)int i删除位置//     (传出)ElementType &e 存储删除节点元素的值//作用: 线性表中删除一个元素//返回值: ElementType型返回删除结点元素的值/****---------------------------------------------****/ElementType DeleteNode(LinkList &L, int i, int &e){    Node *p;    p = L;    //定义一个指向第i个结点的指针p    Node *q;  //暂时存放待删除结点    int j = 0;        //顺指针向后查找,直到p指向第i个结点    while (p->next && j < i) {        p = p->next;        j++;    }        //删除位置合法性判断    if (!p || j > i) {        cout << "element is not exist!";        return 0;    }        q = p->next;    p->next = q->next;  //删除第i个结点    e = q->data;    free(q);    return e;   //返回删除结点元素的值}#pragma mark - 显示线性表中的所有元素/****----------------------------------------------****///函数名: DisplayList(LinkList &L)//参数: (传入)LinkList &L,线性表头指针L的地址//作用: 显示线性表中所有元素//返回值: 无/****---------------------------------------------****/void DisplayList(LinkList &L){    Node *p;    p = L->next;    //定义一个指向表头结点的指针p    while (p != NULL) {        printf("%d ", p->data);        p = p->next;    }    printf("\n");}#pragma mark - 主函数int main(int argc, const char * argv[]) {    Node *L1;    int NodeNum;    printf("Please input the Init LinkNode Number:\n");    scanf("%d", &NodeNum);    L1 = CreateOne(NodeNum);        //Node *L2;    //CreateTwo(L2, NodeNum);  //也可以这样生成L2链表        //输出当前链表内容    printf("the current L1 is:");    DisplayList(L1);        //调用    int result;   //为了判断调用成功与否,可以定义result以备检查    result = InsertNode(L1, 3, 88);    if (result) {        printf("success to insert!\n");    }        ElementType deleteNumber;    DeleteNode(L1, 0, deleteNumber);    printf("被删除的元素为: %d\n", deleteNumber);    //输出当前链表的内容    printf("the curent L1 is:");    DisplayList(L1);    return 0;}