当前位置:编程学习 > C/C++ >>

解决一个问题 谢谢了 用C语言

自行设计程序实现

1.建立一个单链表。

2.并在指定的位置完成插入、删除运算。

3.并输出插入、删除结点后的单链表。
答案:#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

struct node

{

int data;

struct node *next;

};

struct node *initlist()

{

struct node *head;

head = (struct node *)malloc(sizeof(NODE));

head->next = NULL;

return head;

}//initlist

struct node *create()

{

struct node *p1, *p2, *head;

int a;

p2=head =initlist();

printf("Please input a number(if(-1) stop):");

scanf("%d", &a);

while (a!=-1)

{

p1 = (struct node *)malloc(sizeof(struct node));

p1->data=a;

p2->next=p1;

p2=p1;

printf("Please input a number(if(-1) stop):");

scanf("%d", &a);

}

p2->next = NULL;

return head;

}//create

struct node *delete(struct node *head, int num)

{

struct node *p,*temp;

p=head;

while(p->next!=NULL&&p->next->data != num)

{

p=p->next;

}

if(p->next!=NULL)

{

p->next=temp->next;

free(temp);

printf("Delete successfully");

}

else

printf("Not found!");

return head;

}//delete

struct node *insert(struct node *head, struct node *s, stuct node *p)

{

//已知p是链表的一个元素,插入在之后

s->next = p->next;

p->next = s;

}//insert

void printlist(struct node *head)

{

struct node *p;

p=head->next;

while(p!=NULL)

{

printf("%d\n", p->data);

}

}

void main()

{

int a ;

struct node *head, *p,*s;

head = create();

p = head->next;

scanf("%d",&a);

s=(struct node *)malloc(sizeof(struct node));

s->data = a;

head=insert(head,s,p);

print (head);

head=delete(head, a);

print(head);

}

本人初学链表时候写的,不过还算清楚 希望对你有用 要求3的功能只需调用print_all()函数 传入对应节点指针即可

#include "stdio.h"
#include "malloc.h"
#define AREA sizeof(struct node)

struct node{
int data;
struct node *next;
};

int n;//全局,用于记录链表长度
//---------------创建链表--------------
struct node *creat(void){
struct node *head;//链表头地址
struct node *end;//链表末尾地址
struct node *p;//中转指针
n=0;//节点个数
p=(struct node*) malloc(AREA);//开辟空间
end=p;
scanf("%d",&p->data);//录入第一节点的数据
head=NULL;//头指针
while(p->data != 0){
n=n+1;
if(n==1) head=p;//头指针赋值
else end->next=p;//其余指针赋值
end=p;//末尾指针赋值
p=(struct node*) malloc(AREA);//中转指针开辟新空间
printf("输入下一结点:\n");
scanf("%d",&p->data);//除第一节点外的节点数据录入
}
end->next=NULL;//最终的末节点指向空
return (head);//返回链表头
}
//---------------打印全表--------------
void print_all(struct node *head){
struct node *p;//用于遍历
printf("\n链表中存有以下(%d个)数据:\n",n);
p=head;
if(head != NULL){
do{
printf("%d\n",p->data);
p=p->next;
}while(p != NULL);
}
}
//---------------数据查找--------------
void search(struct node *head,int data){
struct node *p;
p=head;
if(head ==NULL){
printf("链表不存在!\n");
return;
}
while(p->data !=data && p->next != NULL) p=p->next;
if(p->data==data){
printf("\n查找完毕,找到对应结果:\n%d\n",p->data);
goto end_search;
}
printf("\n查找完毕,没有对应结果!\n");
end_search:return;
}
//---------------数据删除--------------
struct node *delete(struct node *head,int data){
struct node *p=head;
struct node *q;
if(head ==NULL){
printf("删除失败,链表不存在!\n");
return(head);
}
while(p->data != data&&p->next !=NULL){
q=p;
p=p->next;
}
if(data==p->data){
if(p==head) head=head->next;
else q->next=p->next;
free(p);//释放被删除节点的空间
printf("删除节(%d)点成功!\n",data);
n=n-1;
}else printf("删除失败,指定节点未找到!\n");
return(head);
}
//---------------数据插入--------------
struct node * insert(struct node *head,int data){
struct node *q;
struct node *p=head;
struct node *ins=(struct node*) malloc(AREA);
if(head ==NULL){
printf("插入节点失败,链表不存在!\n");
return(head);
}
while(data > p->data&&p->next !=NULL){
q=p;
p=p->next;
}
ins->data=data;
if(data<=head->data){
ins->next=head;
head=ins;
}
if(data >= p->data){
p->next=ins;
}
q->next=ins;
ins->next=p;
n=n+1;
return(head);
}
void free_all(struct node *head){
struct node *p=head,*q;
while(p->next !=NULL){//删除末尾节点前的节点
q=p;
p=p->next;
free(q);
}
free(p);//释放末尾节点
n=0;//重置节点计数
printf("复位成功!\n");
}
//---------------主程序入口-------------
int main(){
int ctrl=0;//操作前的号码
int input;//操作中输入的数据
struct node *head;
bb: printf("输入数据,创建链表:(int类型,以0结束输入)\n");
head=creat();
print_all(head);
printf("输入操作前的号码,选择对应操作:\n");
cc: printf("1:复位\n2:查找\n3:插入\n4:删除\n5:打印\n0:退出程序\n");
scanf("%d",&ctrl);
switch(ctrl){
case 1:free_all(head);
goto bb;
case 2:printf("请输入要查找的数据:(int)\n");
scanf("%d",&input);
search(head,input);
break;
case 3:printf("请输入要插入的数据:(int)\n");
scanf("%d",&input);
head=insert(head,input);
break;
case 4:printf("请输入要删除的数据:(int)\n");
scanf("%d",&input);
head=delete(head,input);
break;
case 5:print_all(head);break;
case 0:printf("拜拜!");return 0;
default:printf("请正确输入!\n");break;
}
goto cc;
}

上一个:不知道C语言怎样才能学好?
下一个:C语言里的gets()函数

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,