通用的双向链表,算是对前两种总结的过程,还不成熟请指教

链表的 头文件

/*
 * Copyright (c) 2009-~ Du Jinhui
 *
 * This source code is released for free distribution under the terms of the
 * GNU General Public License
 *
 * Author      : Du Jinhui
 * Created Time: Jun 22 May 2011 09:40:03 PM CST
 * File Name   : link.h
 *
 * Description: 
 */
#ifndef LINK_H
#define LINK_H
typedef struct link_list{
 void *pData;
 struct link_list *next;
 struct link_list *prior;
}link_list_t;
extern link_list_t;

typedef link_list_t* (*callbackInit)();
extern link_list_t* Init(callbackInit);


extern link_list_t* GetTail(link_list_t* head,int num);
extern int LinkNum(link_list_t* head);
#endif

 

链表源文件

#include"link.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

link_list_t* Init(callbackInit func)
{
 link_list_t* head;
 head = func();
 return head;
}

/* 链表节点总数*/
int LinkNum(link_list_t* head)
{
  int sum = 0;
 link_list_t* p;
  p = head;
  while(p != NULL)
  {
    p = p->next;
    sum++;
  }
  return sum;
}

/* 获得链表尾节点*/
link_list_t* GetTail(link_list_t *head,int num)
{
link_list_t* p;
 int sum = 0;

 p = (link_list_t*)malloc(sizeof(link_list_t));
 p = head;
 while(p != NULL)
 {
  sum++;
  p = p->next;
  if(num-1 == sum)
  {
   return p;
  }
 }
}

 

//以上是头文件和源文件

利用回调函数分别进行初始化,然后处理

/

/* 第一部分对整数*/

#include"link.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

link_list_t* InitLink();
void SortLink(link_list_t* head,link_list_t* tail);
void PrintLink(link_list_t*  node);

int main(void)

 link_list_t* head;
 link_list_t* tail;
 head = Init(InitLink);
  int num = 0;
 num = LinkNum(head);
 tail = GetTail(head,num);
 SortLink(head,tail);
 PrintLink(head);
}

/*初始化链表,在链表节点里加入数字*/
link_list_t* InitLink()
{
 link_list_t *head,*p,*n;
  int x,cycle;
 head = (link_list_t* )malloc(sizeof(link_list_t));
  p = head;
  cycle = 1;
  while(cycle)
  {
    printf("please enter data:\n");
    scanf("%d",&x);
    if(x != 0)
    {
      n = (link_list_t* )malloc(sizeof(link_list_t));
      int *temp = (int*)malloc(sizeof(int));
      *temp = x;
      n->pData = temp;
      //printf("%d ",*(int*)n->s);
      p->next = n;
      n->prior = p;
      p = n;
    }
    else
    {
      cycle = 0;
    }
  }
  head = head->next;
  head->prior = NULL;
  p->next = NULL;
 return head;
}

/* 对数字进行排序*/
void SortLink(link_list_t* head,link_list_t* tail)
{
 link_list_t *q,*p,*flag;
  q = (link_list_t* )malloc(sizeof(link_list_t));
  p = (link_list_t*)malloc(sizeof(link_list_t));
  flag = (link_list_t* )malloc(sizeof(link_list_t));
  flag = head;
  p = tail;
  q = NULL;
  int t;
  while (flag != NULL)
      {
            flag = NULL;
       for (q = head; q != p; q = q->next)
            {
                 if ((*(int*)q->pData) > (*(int*)q->next->pData))
                 {        
                            t = *(int*)q->pData;
                            *(int*)q->pData = *(int*)q->next->pData;
                            *(int*)q->next->pData = t;                        
                            flag = q;
                }    
  }
         
         p = flag;
     }
}

/* 打印链表节点里面的数字*/
void PrintLink(link_list_t*  node)
{
 link_list_t*  q;
  q = (link_list_t *)malloc(sizeof(link_list_t));
  printf("Now the link: ");
  do
  {
     q=node;
     printf("%d ",*((int*)node->pData));
     node=node->next;
     free(q);
   }
  while(node!=NULL);
   char c;
   c = getchar();
}

 

//

/* 第二部分对字符串*/

#include"link.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

link_list_t* InitLink();
void SortLink(link_list_t* head,link_list_t* tail);
void PrintLink(link_list_t*  node);

int main(void)

 link_list_t* head;
 link_list_t* tail;
 head = Init(InitLink);
  int num = 0;
 num = LinkNum(head);
 tail = GetTail(head,num);
 SortLink(head,tail);
 PrintLink(head);
}

/*初始化链表,在链表节点里加入字符串*/
link_list_t* InitLink()
{
 char st[50];
 link_list_t *head,*ps,*lochead;
 head = (link_list_t *)malloc(sizeof(link_list_t));
 lochead = head; 
 while(1)
 {
  ps = (link_list_t *)malloc(sizeof(link_list_t));
  lochead->next = ps ;
  ps->prior = lochead ;
  printf("input data:");
  scanf("%s",st);
  char* temp = (char*)malloc(strlen(st)*sizeof(char));
  // ps->s = (char*)malloc(strlen(st)*sizeof(char));
  ps->pData = temp;
  strcpy((char*)ps->pData , st);
  //printf("listInfo:%s",ps->s); 
  lochead = ps;
  printf("输入exit退出:");
  scanf("%s",st);
  if(!strcmp("exit",st))
  break;
 }
 head = head->next;
 head->prior= NULL;
 lochead->next = NULL;
 return head;
}

/* 对字符串进行排序*/
void SortLink(link_list_t* head,link_list_t* tail)
{
 link_list_t *q,*p,*flag;
  q = (link_list_t*)malloc(sizeof(link_list_t));
  p = (link_list_t*)malloc(sizeof(link_list_t));
  flag = (link_list_t*)malloc(sizeof(link_list_t));
  flag = head;
  p = tail;
  q = NULL;

  while (flag != NULL)
 {
  flag = NULL;
      for (q = head; q != p; q = q->next)
            {
   if (strcmp((char*)q->pData,(char*)q->next->pData) > 0)
                 {
      // char* t= (char *)malloc( q->num * sizeof(char) );
                         char* tmp = (char *)malloc(strlen((char*)q->pData)*sizeof(char));  
    //*t =* (q->s);
      strcpy(tmp,(char*)q->pData);
                            //*(q->s) = *(q->next->s);
      strcpy((char*)q->pData,(char*)q->next->pData);
                            //*(q->next->s) = *t;
       strcpy((char*)q->next->pData,tmp);
                            flag = q;
                 }
         }

           p = flag;
      }
}

/* 打印链表节点里面的数字*/
void PrintLink(link_list_t*  node)
{
 link_list_t*  q;
  q = (link_list_t *)malloc(sizeof(link_list_t));
  printf("Now the link: ");
  do
  {
  q=node;
     printf("%s ",(node->pData));
     node=node->next;
     free(q);
   }
   while(node!=NULL);
   char c;
   c = getchar();
}


 

 

### 回答1: 双向链表的插入过程包括以下几个步骤: 1. 创建一个新节点,该节点包含要插入的数据。 2. 找到需要插入新节点的位置,可以从头节点开始向后遍历链表,直到找到一个合适的节点位置。 3. 将新节点的前驱指针指向找到的节点的前驱节点,将新节点的后继指针指向找到的节点。 4. 将找到的节点的前驱节点的后继指针指向新节点,将找到的节点的前驱指针指向新节点。 5. 插入完成后,更新链表的头节点和尾节点指针。 注意:在双向链表中,每个节点都有一个前驱指针和后继指针,因此插入操作需要同时更新前驱和后继指针。 ### 回答2: 双向链表是一种数据结构,它由多个节点组成,每个节点包含了一个数据元素和两个指向前一个节点和后一个节点的指针。双向链表可以在链表的任意位置进行插入操作。 插入操作分为两种情况: 1. 插入在链表的头部:首先创建一个新的节点,将新节点的指针指向原链表的头节点,并将原链表的头节点的前驱指针指向新节点。然后将新节点设为链表的新头节点即可。 2. 插入在链表的中间或尾部:首先创建一个新的节点,将新节点的指针指向要插入位置的后继节点,并将新节点的前驱指针指向要插入位置的前驱节点。然后将要插入位置的前驱节点的后继指针指向新节点,将要插入位置的后继节点的前驱指针指向新节点即可。 总的来说,双向链表的插入过程需要完成以下步骤: 1. 创建一个新节点,并将要插入的元素存储在新节点中。 2. 找到要插入位置的前驱节点和后继节点。 3. 更新新节点的指针,将其指向前驱节点和后继节点。 4. 更新前驱节点的后继指针,将其指向新节点。 5. 更新后继节点的前驱指针,将其指向新节点。 通过这样的插入过程,可以在双向链表中任意位置插入新的元素,灵活地调整链表结构。 ### 回答3: 双向链表是一种常见的数据结构,它的每个节点都包含两个指针,一个指向前一个节点,一个指向后一个节点。 在双向链表的插入过程中,我们需要考虑两种情况: 1. 在链表的头部插入新的节点。 2. 在链表中间或尾部插入新的节点。 在链表头部插入新节点的过程如下: 1. 创建一个新节点,并为其赋值。 2. 将新节点的下一个指针指向原来的头节点。 3. 如果链表非空,将原来的头节点的前一个指针指向新节点;如果链表为空,则将新节点同时设置为头节点和尾节点。 4. 更新链表的头节点。 在链表中间或尾部插入新节点的过程如下: 1. 创建一个新节点,并为其赋值。 2. 在链表中找到需要插入的位置的前一个节点(记为current)以及它的后一个节点(记为next)。 3. 将新节点的前一个指针指向current,将新节点的后一个指针指向next。 4. 如果current不为空,将current的后一个指针指向新节点;如果为空,将新节点同时设置为头节点和尾节点。 5. 如果next不为空,将next的前一个指针指向新节点。 通过以上过程,我们可以在双向链表中插入新节点。无论是在头部、中间还是尾部插入,都可以通过更新节点的指针来实现节点之间的连接。这种插入过程使得双向链表具有前后遍历的特性,对于一些需要频繁插入和删除节点的情况,双向链表可以提高效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值