数据结构首页投稿(暂停使用,暂停投稿)程序员

C语言的链表(篇章之二:动态链表)

2016-06-08  本文已影响489人  遮天的龙

一、【链表的创建】:

【1】、空链表:

Node *createList()
{
  Node *head = (Node*)malloc(sizeof(Node));
  head->next = NULL;
  return head;
}

【2】、头插法;

#include <stdio.h>
typedef struct node
{
   int data;
   struct node *next; //next 是指针变量,指向结构体变量    
}Node;

Node *createList()
{
Node *head = (Node *)malloc(sizeof(Node));//申请了堆空间
head->next = NULL;
Node *cur = NULL;
int tmp;
    while (1)
{
    scanf("%d", &tmp);
    if (tmp == 1)
    {
        break;
    }
    cur = (Node *)malloc(sizeof(Node));
    cur->data = tmp;
    cur->next = head->next;
    head->next = cur;
  }
return head;
}

【3】、尾插法:

Node * createListByEnd(void)
{
    //头节点
    Node * head=(Node *)malloc(sizeof(Node));
    if(NULL == head)
    {
        printf("mallo failer\n");
        return NULL;
    }
    head->next=NULL;
    Node * pre=head;
      printf("please input data : ");
    //输入数据
    int data;
    scanf("%d",&data);
    while(data)
    {
        Node * cur=(Node *)malloc(sizeof(Node));
        if(NULL == cur)
         {
            break;
         }
        cur->data=data;
      //连接到链表的尾部
      cur->next=pre->next;
      pre->next=cur;
      //更新前面节点
      pre=cur;
      //再次输入数据
      scanf("%d",&data);
    }
      return head;
}

二、【链表的遍历和查找】:

链表的结构相对而言比较特殊,在对链表中的结点进行访问和查找的时候,必须从链表的头结点开始,按照链表结点指针域所指的顺序逐个查找结点,直到找到为止。和对数组元素的访问一样,利用循环结构对链表结点 进行遍历是一种常用的方法,中使用的就是while循环结构,循环的终止条件便是判断next指针是否为NULL(即是否已经到达了最终结点)。

【1】链表的遍历:

void traverseList(Node * head)
{
    head = head->next;
    while(head!=NULL)
    {
    printf("%d\n",head->data);
    head = head->next;
    }
}

【2】链表的查找:

Node *findNodeList(Node * head, int nfind)
{
    while (head->next)
    {
    if (head->data == nfind)
        return head;
    head = head->next;
    }
  return head;
}

三、【链表的插入与求长度】:

/*
插入节点 暂时只是头插入法
*/
void insertLinkNode(Node * head,int insertData)
{
    Node * curNode = (Node *)malloc(sizeof(Node));
    if(NULL == curNode)
    {
        printf("malloc is error\n");
        return NULL;
    }
    curNode->data=insertData;
  //先保证新节点指向父节点的下一个节点
  //然父节点指向新节点
  //这样做的目的可以保证链表不被破坏
  curNode->next=head->next;
  head->next=curNode;
}


/*
获取链表长度
*/
int lengthLink(Node * head)
{
    int len=0;
  //首元节点
    head=head->next;
    while(head)
    {
      head=head->next;
      len++;
    }
    return len;
}

四、【链表的删除】:

 //删除链表
void deleteList(Node *head ,Node *find)
{
  while (head->next != find) head = head->next;
  head->next = find->next;
  free(find);
  find = NULL;
  return ;
}   

还有一些关于链表的深入,笔者将在以后继续讲。谢谢哈。

上一篇 下一篇

猜你喜欢

热点阅读