|

楼主 |
发表于 2021-9-17 16:58:32
|
显示全部楼层
多谢大佬,解决了!
- //链表的相关操作集
- #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;
- }
复制代码 |
|