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

本文介绍了一个双向链表的数据结构实现,包括初始化、获取链表长度、获取尾节点等基本操作,并展示了如何对链表中存储的整数和字符串进行排序及打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表的 头文件

/*
 * 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();
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值