#ifndef __DD_H__
#define __DD_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char datedef[20];
typedef struct Node //定义单向链表结点
{
union //数据域
{
int len; //头结点的数据域 (链表长度)
datedef date; //其他结点的数据域
};
struct Node *next; //指针域
}*looplist,Looplist;
looplist creat(int flag); //创建新链表
void output(looplist L); //遍历
int h_insert(looplist L,datedef s); //头插
int r_del(looplist L); //尾插
int p_find(looplist L,int n); //查看位置元素
int e_search(looplist L,datedef e); //查找元素位置
void L_free(looplist L); //链表释放
#endif
looplist creat(int flag) //创建链表新结点
{
looplist L=(looplist)malloc(sizeof(struct Node));
if(L==NULL) return NULL;
if(flag==1) //头结点
{
L->len=0;
L->next=L;
}
else if(flag==0) //其他结点
{
strcpy(L->date," ");
L->next=NULL; //初始化
}
return L;
}
void output(looplist L) //遍历
{
if(L->next==L||L==NULL)
{
printf("遍历失败\n");
return;
}
printf("输出的元素是:\n");
looplist p=L;
while(p->next!=L)
{
p=p->next;
printf("%s\t",p->date);
}
puts("");
printf("该链表有%d个元素。\n",L->len);
}
int h_insert(looplist L,datedef s) //头插
{
if(L==NULL)
{
printf("头插失败\n");
return -1;
}
looplist q=creat(0);
if(q==NULL) return -1;
strcpy(q->date,s);
q->next=L->next;
L->next=q;
L->len++;
return 0;
}
int r_del(looplist L) //尾删
{
if(L==NULL||L->next==L)
{
printf("尾删失败\n");
return -1;
}
looplist p=L;
while(p->next->next!=L)
{
p=p->next;
}
looplist s=p->next;
p->next=L;
free(s);
s=NULL;
L->len--;
return 0;
}
int p_find(looplist L,int n) //查看位置元素
{
if(L==NULL||n<1||n>L->len)
{
printf("位置不合法\n");
return -1;
}
looplist p=L;
for(int i=0;i<n;i++)
{
p=p->next;
}
printf("你要找的第%d个元素为:%s\n",n,p->date);
return 0;
}
int e_search(looplist L,datedef e) //查找元素位置
{
if(L==NULL||L->next==L)
{
printf("查找失败\n");
return -1;
}
looplist p=L;
int n=1;
while(p->next!=L)
{
p=p->next;
if(strcmp(p->date,e)==0)
{
printf("你要找的元素在第%d个\n",n);
return n;
}
n++;
}
if(n>L->len)
{
printf("查找失败\n");
return -1;
}
}
void L_free(looplist L) //链表释放
{
if(L==NULL) return;
int n=L->len;
for(int i=0;i<n;i++)
{
r_del(L); //尾删
}
free(L);
L=NULL;
}
int main(int argc,const char *argv)
{
looplist L=creat(1);
int n;
datedef s,e;
printf("你要头插的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("你要头插的元素是:");
scanf("%s",s);
h_insert(L,s); //头插
}
output(L);
printf("你要尾删的元素个数:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
r_del(L); //尾插
}
output(L);
printf("你要查看第几个元素");
scanf("%d",&n);
p_find(L,n); //查看位置元素
printf("你要查找的元素是:");
scanf("%s",e);
n=e_search(L,e); //查找元素位置
L_free(L); //链表释放
}