关于链表的c语言程序

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{int data;
struct node *next;
}slink;

int n;

slink *creat(); //创建链表

int insert(slink *head,int i,int x);//在结点i之前播放一个数x

int del(slink *head,int i,int *x); //删除第i个结点并返回该结点上的数值

slink *get(slink *head,int i); //查找第i个结点,并返回

int length(slink *head); //求链表的长度

void print(slink *head); //输出链表

int main()
{slink *head;
int de,*num=0,ins,len; //de为要删除的结点,ins为要插入的结点

printf("input records:\n");
head=creat();
print(head);

printf("\ninput the delete number:(the number<%d)",n);
scanf("%d",&de);
if(del(head,de,num)==1)
{print(head);
printf("%d",*num);
}
else
printf("delete failure!");

printf("\ninput the inset record:");
scanf("%d",&ins);
if(insert(head,2,ins)==1)
print(head);
else
printf("the insert is failure!");

len=length(head);
printf("the length is %d\n",len);

return 0;
}

slink *creat() /*定义函数,返回带头结点的链表*/
{slink *head;
slink *p1,*p2;
n=0;
head=NULL;
p1=p2=(slink*)malloc(sizeof(slink));
scanf("%d",p1->data);

while(p1->data!=0)
{n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(slink*)malloc(sizeof(slink));
scanf("%d",&p1->data);
}
p2->next=NULL;
return (head);
}

int insert(slink *head,int i,int x)
{slink *p,*pre,*q;
int j=0;
p=(slink*)malloc(sizeof(slink));
p->data=x;
pre=head; /*pre指向待插入结点的前驱结点*/
q=head->next; /*q指向当前比较结点*/
while(q&&j<i-1) /*查找p结点应该插入的位置*/
{pre=q;
q=q->next;
j++;
}
if(j!=i-1||i<1) return 0; /*插入不成功*/
else
{p->next=q; /*将p结点插入链表*/
pre->next=p;
}
return 1; /*插入成功*/
}

int del(slink *head,int i,int *x) /*删除第i个结点,并通过x返回值*/
{slink *p,*q;
int j=0;
p=head;
while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/
{p=p->next; j++;}

if(!(p->next)||j>i-1) return 0; /*删除位置不合适*/
q=p->next; /*删除并释放结点*/
p->next=q->next;
*x=q->data;
free(q);
return 1;
}

slink *get(slink *head,int i) /*查找第i个结点*/
{slink *p;
int j=0;
p=head;
while(p->next&&j<i-1) /*查找第i个结点的前驱*/
{p=p->next; j++;}
if(!(p->next)&&j>i-1) return NULL;
return p->next;
}

int length(slink *head) /*求表的长度*/
{int len=0;
slink *p;
p=head; /*设该表有表头*/
while(p->next){p=p->next; len++;}
return len;
}

void print(slink *head)
{slink *p;
printf("\nNow,these %d records are :\n",n);
p=head;
if(head!=NULL)
do
{printf("%d \n",p->data);
p=p->next;
}while(p!=NULL);

}
这个程序我在vc6.0中进行编译,连接的时候都没问题就是在运行的时候出现错误了,请各位帮帮忙啊!。。。

//兄弟,好好看看带头结点和不带头结点的链表的区别,还有如果你设了全局变量n记录链表长度,length()这个函数就多余了,你可以在删除数据时把n-1,插入数据时把n+1就行了,我简单改了改,你看看吧!!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}slink;

int n;

slink *creat(); //创建链表

int insert(slink *head,int i,int x);//在结点i之前播放一个数x

int del(slink *head,int i,int *x); //删除第i个结点并返回该结点上的数值

slink *get(slink *head,int i); //查找第i个结点,并返回

int length(slink *head); //求链表的长度

void print(slink *head); //输出链表

int main()
{
slink *head;
int de,num=0,ins,len; //de为要删除的结点,ins为要插入的结点
//这里num要用整形数,不用指针
printf("input records:\n");
head=creat();
print(head);

printf("\ninput the delete number:(the number<%d)",n);
scanf("%d",&de); //这里少了一个&符
if(del(head,de,&num)==1)
{
print(head);
printf("%d",num);
}
else
printf("delete failure!");

printf("\ninput the inset record:");
scanf("%d",&ins);
if(insert(head,2,ins)==1)
print(head);
else
printf("the insert is failure!");

len=length(head);
printf("the length is %d\n",len);

return 0;
}

slink *creat() /*定义函数,返回带头结点的链表*/ //兄弟,你建的是不带头结点的链表,带头结点的链表的头结点是不存数据的!!!
{
slink *head;
slink *p1,*p2;
n=0;
head=NULL;
p1=p2=(slink*)malloc(sizeof(slink));
scanf("%d",&p1->data);

while(p1->data!=0)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(slink*)malloc(sizeof(slink));
scanf("%d",&p1->data);
}
p2->next=NULL;
return (head);
}

int insert(slink *head,int i,int x)
{
slink *p,*pre,*q;
int j=0;
p=(slink*)malloc(sizeof(slink));
p->data=x;
pre=head; /*pre指向待插入结点的前驱结点*/
q=head->next; /*q指向当前比较结点*/
while(q&&j<i-1) /*查找p结点应该插入的位置*/
{pre=q;
q=q->next;
j++;
}
if(j!=i-1||i<1) return 0; /*插入不成功*/
else
{p->next=q; /*将p结点插入链表*/
pre->next=p;
}
return 1; /*插入成功*/
}

int del(slink *head,int i,int *x) /*删除第i个结点,并通过x返回值*/
{
slink *p,*q;
int j=0;
p=head;
while(p->next&&j<i-1) /*查找第i个结点的前驱位置p*/
{
p=p->next;
j++;
}

if(!(p->next)||j>i-1) return 0; /*删除位置不合适*/
q=p->next; /*删除并释放结点*/
p->next=q->next;
*x=q->data;
free(q);
n--; //删除了数据,总数n应该减1吧?
return 1;
}

slink *get(slink *head,int i) /*查找第i个结点*/
{slink *p;
int j=0;
p=head;
while(p->next&&j<i-1) /*查找第i个结点的前驱*/
{p=p->next; j++;}
if(!(p->next)&&j>i-1) return NULL;
return p->next;
}

int length(slink *head) /*求表的长度*/
{int len=0;
slink *p;
p=head; /*设该表有表头*/
while(p){p=p->next; len++;} //你建的是不带头链表,所以这里少了一个
return len;
}

void print(slink *head)
{slink *p;
printf("\nNow,these %d records are :\n",n);
p=head;
if(head!=NULL)
do
{printf("%d \n",p->data);
p=p->next;
}while(p!=NULL);

}
温馨提示:答案为网友推荐,仅供参考
相似回答