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

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

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;

}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值