数据结构链表源码
数据结构链表源码,仅供自己复习专用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct Node{
int data;
struct Node *next;
}node,*linklist;
linklist List;
int get(linklist L,int i)
{
int j=1;
linklist p;
p=L->next;
while (p&&j<i)
{
p=p->next;
++j;
}
if(!p&&j>i)
return -1;
return (p->data);
}
int insert(linklist L,int i,int val)
{
int j=1;
linklist p,s;
p=L;
while(p&&j<i)
{
p=p->next;
++j;
}
if(j>i||!p)
return -1;
s=(linklist)malloc(sizeof(node));
s->data=val;
s->next=p->next;
p->next=s;
return 1;
}
int delete(linklist L,int i)
{
int j=1;
linklist p,q;
p=L;
while(p->next&&j<i)
{
p=p->next;
++j;
}
if (!(p->next)||j>i)
return -1;
q=p->next;
p->next=q->next;
free(q);
return 1;
}
void show(linklist L)
{
linklist p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void InitList(void)
{
linklist head;
head=(linklist)malloc(sizeof(node));
List=head;
List->next=NULL;
}
void rearcreat(linklist L,int i)
{
linklist p,t;
p=(linklist)malloc(sizeof(node));
t=L;
while(t->next)
{
t=t->next;
}
t->next=p;
p->data=i;
p->next=NULL;
}
int length(linklist L)
{
int flag=0;
linklist p;
p=L->next;
while(p)
{
p=p->next;
flag++;
}
return flag;
}
int main()
{
int flag,tmp,n;
InitList();
printf("请输入一些数用以初始化链表(输入-1代表输入结束):\n");
while(~scanf("%d",&n))
{
if(n==-1)
break;
rearcreat(List,n);
}
printf("初始化链表后,其链表里面的元素为:\n");
show(List);
printf("请输入相关操作指令(输入end表示操作结束):insert,show,delete,get,LinkList'sLength\n");
char s[50];
memset(s,'\0',sizeof(s));
while(~scanf("%s",s))
{
if(!strcmp(s,"end"))
break;
if(!strcmp(s,"insert"))
{
printf("请输入你想要插入的位置和值中间以空格隔开:\n");
int location,val;
scanf("%d%d",&location,&val);
tmp=length(List);
if(tmp<location)
printf("指针飘移,位置出错!!!\n");
else
{
flag=insert(List,location,val);
if(flag==-1)
printf("指针飘移,位置出错!!!\n");
else
{
printf("恭喜你!插入成功。\n插入成功后,链表元素为:");
show(List);
}
}
}
if(!strcmp(s,"delete"))
{
printf("请你想要删除的位置:\n");
int location;
scanf("%d",&location);
tmp=length(List);
flag=delete(List,location);
if(tmp<location||flag==-1)
printf("指针飘移,位置出错!!!\n");
else
{
printf("恭喜你!删除成功。\n删除成功后,链表元素为:");
show(List);
}
}
if(!strcmp(s,"get"))
{
printf("请你想要获取元素的位置:\n");
int location;
scanf("%d",&location);
tmp=length(List);
if(tmp<location)
printf("指针飘移,位置出错!!!\n");
else
{
flag=get(List,location);
if(flag==-1)
printf("指针飘移,位置出错!!!\n");
else
{
printf("恭喜你!获取成功:位置为 %d 的元素其值为 %d 。\n",location,flag);
}
}
}
if(!strcmp(s,"show"))
{
printf("恭喜你!展示成功,链表元素为:\n");
show(List);
}
if(!strcmp(s,"LinkList'sLength"))
{
flag=length(List);
printf("恭喜你!获取成功,链表长度为:%d\n",flag);
}
memset(s,'\0',sizeof(s));
}
return 0;
}