单链表
我去终于做出来了 不是难 是前面的东西学的不扎实导致有的东西理解的不到位
又恶补了一下 终于做出来了 世上无难事,只怕有心人。光改错就好几就 想放弃的时候
想一想问什么别人可以做出来 你为什么不行。。。多琢磨下 画画图 估计每个学过c语言的同学都可以做出来
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
} lnode,*linklist;
linklist creat( void)
{ int n,k,i;
linklist l,p,r;
l=(linklist)malloc(sizeof(lnode));
if( l==NULL)
{
printf("内存分配失败");
exit(-1);
}
l->next=NULL;
r=l;
printf("请输入链表共有数字:");
scanf("%d",&n) ;
for( i=0;i<n;i++)
{
p=(linklist)malloc(sizeof(lnode));
if( p==NULL)
{
printf("内存分配失败");
exit(-1);
}
printf("链表的值:");
scanf("%d",&p->data);
r->next=p;
p->next=NULL;
r=p;
}
return l;
}
int insert(linklist l,int i,int x)
{
linklist p,s;
p=l;int j=1;
while(p!=NULL&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return 0;
else{
s=(linklist)malloc(sizeof(lnode));
s->data=x;
s->next=p->next;
p->next=s;
}
return 0;
}
int del(linklist l,int i,int x)
//LinkList&L 是引用传递 可以起到修改链表的效果
//LinkList L 是值传递 传的是L的一个副本 对副本操作后无法起到修改链表的效果
{
linklist p,q;
p=l;
int j=0;
while(p&&j<i){
p=p->next;
j++;
}
if(!(p||j>i))
return 0;
q=p->next;
p->next=q->next;
x=q->data;
free(q);
return 0;
}
int len(linklist l)
{
linklist p;
int j=0;
p=l->next;
while(p!=NULL)
{ j++;
p=p->next;
}
printf("链表长度为:%d",j);
return 0;
}
int clear(linklist l)
{
linklist q,p;
int j=0;
p=l->next;
while(p!=NULL)
{
q=p->next;
l->next=q;
free(p);
p=q;
}
l->next=NULL;
}
void print(linklist l)
{
linklist p,r,s;
p=l->next;
while(p!=NULL)//链表不为空
{
printf("%d ",p->data );
p=p->next;
}
printf("\n");
}
int main()
{
linklist l,p,s;
int x,n,i,choose;
l=(linklist)malloc(sizeof(lnode));
l->next=NULL;
l->data=-1;
l=creat();
print(l);
printf("请输入操作:\n");
printf("输入操作1:length\n");
printf("输入操作2:insert\n");
printf("输入操作3: delete\n");
printf("输入操作4:clear\n");
while(scanf("%d",&i)){
switch(i)
{
case 1: len(l);
break;
case 2: insert(l,2,2);print(l);
break;
case 3:del(l,2,2); print(l);
break;
case 4:clear(l);print(l);
break;
default :printf("error");
}
}
return 0;
}