单链表

程序构思:
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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容