解决一个问题 谢谢了 用C语言
自行设计程序实现1.建立一个单链表。
2.并在指定的位置完成插入、删除运算。
3.并输出插入、删除结点后的单链表。
自行设计程序实现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()函数