多谢大佬,解决了!//链表的相关操作集
#include<stdio.h>
#include<stdlib.h>
typedef struct Node *node;
struct Node{
int data;
node next;
};
node CreateList()//构建链表
{
node head=NULL,tail,p;
int num;
scanf("%d",&num);
if(num==-1)
{
return head;
}
else
{
p=(node)malloc(sizeof(struct Node));
head = p;
}
while(num!=-1)
{
tail=p;//步骤一:将尾结点指向新节点
tail->data = num;//步骤二:给新申请的结点传入数据
p=(node)malloc(sizeof(struct Node));//步骤三:申请新的结点
tail->next=p;//步骤四:链接
scanf("%d",&num);//步骤五:继续读入带传入的数据,通过此数据来判断是否要继续申请下一个结点
}
tail->next=NULL;//步骤六:比较容易遗忘的一点,就是让尾结点指向NULL
return head;
}
void Print(node head)//打印链表中的数据
{
node p=head;
while(p!=NULL)
{
printf("%4d",p->data);
p=p->next;
}
putchar('\n');
}
node Delete_K(node head,int k)//删除带有数值K的结点,由于要改变传入指针(指向结构体的指针)的值(此情况是特殊情况,当删除的结点是头结点),因此要传入指针的指针来改变指针的值
{
node p=head,temp=NULL;
if(p==NULL)
{
printf("链表为空\n");
return NULL;
}
while(p!=NULL)
{
if(p->data==k)//找到要删除的节点的位置
{
if(p==head)//为第一个结点
{
head=p->next;
free(p);
break;
}
else
{
temp->next=p->next;
free(p);
break;
}
}
temp=p;
p=p->next;
}
if(p!=NULL)
{
return head;
}
else
{
printf("未找到!\n");
return head;
}
}
void Insert_n_th(node head,int n)//插入到第n个结点之后
{
node p=head,temp=NULL;
int cnt=1;
while(cnt!=n&&p!=NULL)//为何这里的不是永真
{
p=p->next;
cnt++;
}
if(p==NULL)
printf("not found!");
else
{
temp=(node)malloc(sizeof(struct Node));//申请新节点的内存
printf("请输入要插入的结点的值:\n");
scanf("%d",&temp->data);//为新节点传入数据
temp->next=p->next;
p->next=temp;
}
}
int main(int argc,char *argv[])
{
node head=NULL;
head=CreateList();
Print(head);
int n;
printf("请输入插入到第几个节点后面:\n");
scanf("%d",&n);
Insert_n_th(head,n);
Print(head);
int k;
printf("请输入要删除结点的值:\n");
scanf("%d",&k);
head=Delete_K(head,k);
Print(head);
return 0;
}
|