数据结构中的线性表的链式实现(数据元素是字符串),新手向,大佬就别看了,浪费时间。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef struct LNode{
char name[20];
struct LNode *next;
}LNode,*LinkList;
int main(){
LinkList InitList(); //链表顺序初始化函数
Status ListInsert(LinkList ,int ,char *);//插入函数
LinkList CreateList(int );//链表逆序初始化函数
Status ListDelete(LinkList ,int ,char *);//删除元素函数
void visit(char *);//元素访问函数
void ListTraverse(LinkList ,void (*f)(char *));//链表遍历函数
void DestroyList(LinkList);//链表销毁函数
Status ListEmpty(LinkList);//判断是否为空表函数
int ListLength(LinkList);//求表长函数
void GetElem(LinkList ,int ,char *);//按位置获取元素
Status compare(char *,char *);//两个元素的比较函数
int LocateElem(LinkList ,char *,Status (*f)(char *,char *));//按值定位函数
void PriorElem(LinkList ,char *cur,char *pri);//求前置元素函数
void NextElem(LinkList ,char *cur,char *pri); //求后置元素函数
LinkList l=InitList();
char a[20]="你好",b[20]="再见";
if(ListInsert(l,1,a)==0){
printf("插入函数有问题\n");
}
ListInsert(l,2,b);
printf("链表当前的长度:%d\n",ListLength(l));
ListTraverse(l,visit);
printf("\n\"再见\"的位置是%d\n",LocateElem(l,"再见",compare));
char prior[20],next[20];
PriorElem(l,"再见",prior);
printf("\"再见\"的前置元素是:%s\n",prior);
NextElem(l,"你好",next);
printf("\"你好\"的后置元素是:%s\n",next);
char c[20];
ListDelete(l,1,c);
printf("删除第一个元素后,链表的当前的长度:%d\n",ListLength(l));
ListTraverse(l,visit);
GetElem(l,1,c);
printf("\n获取链表位置1的元素:%s\n",c);
DestroyList(l);
LinkList k=CreateList(3);
ListTraverse(k,visit);
DestroyList(k);
return 0;
}
LinkList InitList(){
LinkList t=(LinkList)malloc(sizeof(LNode));
if(!t){
exit(1);
}
t->next=NULL;
return t;
}
Status ListInsert(LinkList l,int i,char *e){
LinkList p=l;
int j=0;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1){
return ERROR;
}
LinkList s=(LinkList)malloc(sizeof(LNode));
strcpy(s->name,e);
s->next=p->next;
p->next=s;
return OK;
}
Status ListDelete(LinkList l,int i,char *e){
LinkList p=l;
int j=0;
while(p->next&&j<i-1){
p=p->next;
++j;
}
if(!(p->next)||j>i-1){
return ERROR;
}
LinkList q=p->next;
p->next=q->next;
strcpy(e,q->name);
free(q);
return OK;
}
void visit(char *e){
printf("%s\t",e);
}
void ListTraverse(LinkList l,void (*f)(char *)){
if(!l){
exit(1);
}
LinkList p=l;
for(p=p->next;p!=NULL;p=p->next){
f(p->name);
}
}
void DestroyList(LinkList l){
LinkList p=l;
if(p->next!=NULL){
DestroyList(p->next);
free(p);
}else{
free(p);
}
}
Status ListEmpty(LinkList l){
if(!l){
return ERROR;
}
if(l->next==NULL){
return TRUE;
}else{
return FALSE;
}
}
int ListLength(LinkList l){
if(!l){
return ERROR;
}
int j=0;
for(LinkList p=l;p->next!=NULL;p=p->next){
j++;
}
return j;
}
void GetElem(LinkList l,int i,char *e){
if(!l){
exit(1);
}
LinkList p=l;
for(int j=0;j<i;j++){
p=p->next;
}
strcpy(e,p->name);
}
Status compare(char *a,char *b){
if(strcmp(a,b)==0){
return TRUE;
}else{
return FALSE;
}
}
int LocateElem(LinkList l,char *e,Status (*f)(char *,char *)){
LinkList p=l;
int j=1;
for(p=p->next;p!=NULL;p=p->next){
if(f(e,p->name)==1){
return j;
}
j++;
}
return 0;
}
void PriorElem(LinkList l,char *cur,char *pri){
int i=LocateElem(l,cur,compare);
if(i==1||i==0){
exit(1);
}
GetElem(l,i-1,pri);
}
void NextElem(LinkList l,char *cur,char *next){
int i=LocateElem(l,cur,compare);
if(i==0||i==ListLength(l)){
exit(1);
}
GetElem(l,i+1,next);
}
LinkList CreateList(int n){
LinkList l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
for(int i=n;i>0;--i){
LinkList p=(LinkList)malloc(sizeof(LNode));
scanf("%s",p->name);
p->next=l->next;
l->next=p;
}
return l;
}
运行结果:
链表当前的长度:2
你好 再见
"再见"的位置是2
"再见"的前置元素是:你好
"你好"的后置元素是:再见
删除第一个元素后,链表的当前的长度:1
再见
获取链表位置1的元素:再见
1
2
3
3 2 1
--------------------------------
Process exited after 5.163 seconds with return value 0
请按任意键继续. . .