链表的 头文件
/*
* 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();
}