#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct stu
{
//數據域
int num;
char name[32];
int age;
//指針域
struct stu *next;
struct stu *pre;
}STU;
extern STU* link_insert(STU *head,STU tmp);
extern void link_print(STU *head);
extern void link_search(STU *head);
extern STU* link_sort(STU *head);
int main(int argc,char *argv[])
{
char cmd[32];
STU *head=NULL;
STU tmp;
while(1)
{
//來個指令
printf("請輸入指令:");
scanf("%s",cmd);
//指令的情況分一分
if(strcmp(cmd,"insert")==0)
{
//頭部插入
//插入數據
printf("請輸入要插入的數據:\n");
scanf("%d%s%d",&tmp.num,tmp.name,&tmp.age);
head=link_insert(head,tmp);
}
else if(strcmp(cmd,"print")==0)
{
//雙向遍歷
link_print(head);
}
else if(strcmp(cmd,"search")==0)
{
//找一找
link_search(head);
}
else if(strcmp(cmd,"sort")==0)
{
//排個序吧
head=link_sort(head);
}
else if(strcmp(cmd,"quit")==0)
break;
}
return 0;
}
//一個簡單的頭部插入函數
STU* link_insert(STU *head,STU tmp)
{
STU *pi=NULL;
//1、爲數據申請一個堆區空間吧
pi=(STU *)calloc(1,sizeof(STU));
//2、將tmp的數據賦給pi
*pi=tmp;
//3、鏈表不存在時
if(NULL==head)
{
head=pi;
head->next=head;
head->pre=head;
}
//4、鏈表存在(挺複雜的)
else
{
pi->next=head;
pi->pre=head->pre;
pi->pre->next=pi;
head->pre=pi;
head=pi;
}
return head;
}
//一個複雜的雙向遍歷函數
void link_print(STU *head)
{
if(NULL==head)//這該死的鏈表還沒寫呢
{
printf("link not found!!!");
return ;
}
else//鏈表找到了
{
STU *pb=head;//頭
STU *pf=head->pre;//尾
printf("雙向遍歷的結果哦!\n");
do
{
if(pb==pf)//頭尾合一
{
printf("%d %s %d \n",pb->num,pb->name,pb->age);//打印一個
break;
}
printf("%d %s %d \n",pb->num,pb->name,pb->age);
printf("%d %s %d \n",pf->num,pf->name,pf->age);
pb=pb->next;//移動
pf=pf->pre;//我也來
}
while(pb->pre != pf);
}
return;
}
//簡單的查找函數
void link_search(STU *head)
{
//鏈表不存在的情況
if(NULL==head)
{
printf("link not found!!!\n");
return;
}
else//鏈表存在
{
STU *pi=head;
STU *pb=head->pre;
char name[32];
printf("請輸入要查找的節點名字:");
scanf("%s",name);
//查找
do
{
if(strcmp(name,pi->name) == 0 )//pi找到了name
{
printf("%d %s %d \n",pi->num,pi->name,pi->age);
break;
}
else if(strcmp(name,pb->name) == 0)//pb找到了name
{
printf("%d %s %d \n",pb->num,pb->name,pb->age);
break;
}
pi=pi->next;//我往後移
pb=pb->pre;//我往前移動
}
while(pb !=pi && pi->pre != pb);//不相遇,不相等
}
return;
}
//排序函數
STU* link_sort(STU *head)
{
//鏈表不存在的情況
if(NULL==head)
{
printf("link not found!!!\n");
return head;
}
else//鏈表存在,用選擇排序法來搞
{
STU *p_i=head;
STU *pb=head;
while(p_i->next!=pb)//外層循環
{
STU *p_min=p_i;
STU *p_j=p_min->next;
while(p_j != pb)//內層循環
{
if(p_min->num > p_j->num)
p_min = p_j;//最小值
p_j = p_j->next;//右移
}
if(p_min != p_i)//排序
{
//整體交換
STU tmp;
tmp = *p_i;
*p_i = *p_min;
*p_min = tmp;
//指針域交換回來
tmp.next = p_i->next;
tmp.pre = p_i->pre;
p_i->next = p_min->next;
p_i->pre = p_min->pre;
p_min->next = tmp.next;
p_min->pre = tmp.pre;
}
p_i = p_i->next;//外層右移
}
}
return head;
}
運行結果: