一道链表题目:
建立单向 int 链表,连续输入 5 个结点创建链表,并实现在原链表中插入数字、删
除数字的功能。
#include <stdio.h>
#include <stdlib.h>
typedef struct i//结构体的定义
{
int num;
struct i *next;
}def;
def *create()//头链表输入
{
def *head=NULL;//头指针 防止野指针
def *tail,*n;//*tail尾指针,*n新插入的指针
printf("输入五个数据:\n");
int i=0;
while(1)
{
n=(def *)malloc(sizeof(def)); //为n指针开辟一个指针
scanf("%d",&n->num);
if(i==0)
{
head=n;
tail=n;
}
else
{
tail->next=n;
tail=n;
}
i++;
if(i==5)
break;
}
tail->next=NULL;//防止野指针
return head;
}
void print(def *head)//输出链表
{
printf("现在的数有:\n");
def *s;//移动链表
s=head;
while(s!=NULL)
{
printf("%d\n",s->num);
s=s->next;
}
}
void BubbleSort(def *L)
{
int i,count =0,num;//count记录链表结点的个数,num进行内层循环,
def *p,*q,*tail;//创建三个指针,进行冒泡排序
p=L;
while(p->next!=NULL)//计算出结点的个数
{
count++;
p=p->next;
}
for(i=0;i<count-1;i++)//外层循环,跟数组冒泡排序一样
{
num=count-i-1;//记录内层循环需要的次数,跟数组冒泡排序一样,
q =L->next;//令q指向第一个结点
p=q->next;//令p指向后一个结点
tail=L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
while(num--)//内层循环 次数跟数组冒泡排序一样
{
if(q->num>p->num)//如果该结点的值大于后一个结点,则交换
{
q->next=p->next;
p->next=q;
tail->next=p;
}
tail=tail->next;
q=tail->next;
p=q->next;
}
}
}
def *insert(def *head,def *n)//插入数
{
def *s0,*s1;
s0=head;
if(n->num<=head->num)//首项
{
n->next=head;
head=n;
}
else
{
while(n->num>=s0->num)
{
s1=s0;
if(s1->next==NULL)//最后一项
break;
s0=s0->next;
}
if(s1->next!=NULL)
{
n->next=s0;
s1->next=n;
}
else
{
n=s1->next;
n->next=NULL;
}
}
return head;
}
def *del(def *head,int num) //删除数字
{
def *s0,*s1=NULL;
s0=head;
if(head->num==num)
{
head=head->next;
free(s0);
}
else
{
s0=head;
while(s0->num!=num&&s0->next!=NULL)
{
s1=s0;
s0=s0->next;
}
if(s0->num==num)
{
s1->next=s0->next;
free(s0);
}
else
printf("没有这个数字!\n");
}
return head;
}
int main()
{
def *head=NULL;
head=create();//存数
BubbleSort(head);//升序排序
print(head);
def *n;
n=(def *)malloc(sizeof(def));//指针输入要开辟空间。
printf("输入插入的数:");//插入数字
scanf("%d",&n->num);
n->next=NULL;
head=insert(head,n);
print(head);
printf("输入要删除的数:");//删除数字
int num;
scanf("%d",&num);
head=del(head,num);
print(head);
return 0;
}
其中有一个问题。
在我输入5个数之后要插入一个数,如果这个数大于这5个数,这个程序会崩溃。
像这样
不知道有什么问题,有没有人解答一下,谢谢!
其实只要看insert的那一段