栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

单链表一般操作性代码及解释

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单链表一般操作性代码及解释

首先,在认识一般性操作代码前搞懂以下几个定义及解释:

1.头指针表明了链表的起点,可以唯一确定一个单链表。

2.头指针指向链表的第一个结点,其指针域存储的是第一个结点在内存中的位置(地址)。

3.头结点是单链表的第一个结点,数据内容无效,其指针是头指针。

若单链表有头结点,则头指针指向头结点;若单链表不含头结点,则头指针指向第一个结点。

4.一个单链表可以没有头结点,但不能没有头指针。

如图:

不带头结点的单链表

带头结点的单链表

另外一种链表的技巧是使用尾指针。

尾指针是相对于头指针而言的,形式与头指针相同,内容指向链表的最后一个节点。

struct link

{

       int data;

       struct link *next;

}

1.建立链表并输入数据

struct link *head = NULL;     

while (1)

{

scanf("%d", &data);

if (data == -1)

              break;

head = AppendNode(head, data);  //向head为头指针的链表末尾添加节点

}

(1).

struct link *AppendNode(struct link *head, int data)

{

       struct link *p = NULL, *pr = head;

       p = (struct link*)malloc(sizeof(struct link));//新建节点

       if (head == NULL)

       {

              head = p;//若为空表,那么新节点就是头节点

       }

       else

       {

              while (pr->next != NULL)

              {

                     pr = pr->next;

              }//指到最后一个节点的指针域

              pr->next = p;//末指针域指向新建节点

       }

       p->data = data;//赋值

       p->next = NULL;

       return head;

}

//这种是顺序建立,即新建节点数据在上一个新建节点的后面

//无头节点,推荐使用这个

(2).

struct link *pr = NULL;//全局变量

struct link *AppendNode(struct link *head, int data)

{

       struct link *p = NULL;

       p = (struct link *)malloc(sizeof(struct link));//p指向新建节点

       if (head == NULL)

       {

              head = p;

              head->next = NULL;

              pr = head; //此时Pr也指向了p,即新建的节点

       }

       p->data = data;//赋值

       p->next = NULL;

       pr->next = p;

       pr = p;  //倒着看,从第二个开始,

       return head;

}

//这也是顺序链接

//不推荐使用,较难理解,且运行内存不够(全局变量)

2.显示链表

void DisplyNode(struct link *head)

{

       struct link *p = head;

       for (p = head; p != NULL; p = p->next)

       {

              printf("%d", p->data);

              if (p->next != NULL)

                     printf("->");

}

}

3.释放内存

void DeleteMemory(struct link *head)

{

       struct link *p, *pnext;

       p = head;

       while (p != NULL)

       {

              pnext = p->next;

              free(p);

              p = pnext;

}

}

4删除节点

struct ListNode *deletem(struct ListNode *L, int m)

{

       struct ListNode *p1 = L, *p2 = NULL;

       while (p1)

       {

              if (p1->data == m)

              {

                     if (p1 == L)

                     {

                            L = p1->next;

                            free(p1);

                            p1 = L;

                     }

                     else

                     {

                            p2->next = p1->next;

                            free(p1);

                            p1 = p2->next;

                     }

              }

              else

              {

                     p2 = p1;

                     p1 = p1->next;

              }

       }

       if (p2 != NULL)

              p2->next = NULL;

       return L;

}

//循环删除所有要删除的数据

//推荐记忆

5.插入节点

//在升序的链表中插入节点

struct link *InsertNode(struct link *head, int nodeData)

{

       struct link *p = head, *pr = head,*t=NULL;

       p = (struct link*)malloc(sizeof(struct link));//p是插入的

       p->data = nodeData;

       p->next = NULL;

       if (head == NULL)

              head = p;

       else

       {

              while (pr->data < nodeData&&pr->next != NULL)

              {

                     t = pr;

                     pr = pr->next;//记录最后一个比nodeData小的节点

              }

              if (pr->data >= nodeData)

              {

                     if (pr == head)

                     {

                            p->next = head;

                            head = p;

                     }

                     else

                     {

                            pr = t;

                            p->next = pr->next;

                            pr->next = p;

                     }

              }

              else

              {

                     pr->next = p;

              }

       }

       return head;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913707.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号