求助纠正“单链表的基本操作”
本人新手,以下是一个“单链表的基本操作”,是用VS2008编写的C语言,有些错误,请指正,小弟感激不尽!#include<cstdio>
#include<cstdlib>
using namespace std;
typedef char ElementType;
/*结点结构定义*/
struct ListNode
{
ElementType data;
struct ListNode *next;
};
typedef struct ListNode Node;
typedef Node *Linklist;
/*建立单表*/
Linklist creat_list(Linklist head)
{
Linklist ptr,temp;
char ch;
head=(Node*) malloc(sizeof(Node));
if(head==NULL)
printf("错误:空间溢出!\n");
else
{
head->next=NULL;
ptr=head;
printf("请输入数据元素,回车(输入#结束):\n");
while((ch=getchar())!='#')
{
temp=(Node*)malloc(sizeof(Node));
temp->next=NULL;
temp->data=ch;
ptr->next=temp;
ptr=temp;
fflush(stdin);
printf("请输入数据元素(输入#结束):\t");
}
}
return head->next;
}
/*画线函数*/
char draw_line(char c)
{
int i;
printf("\n");
for(i=0;i<60;i++)
printf("%c",c);
printf("\n");
}
/*打印链表*/
void print_list(Linklist head)
{
Linklist ptr;
ptr=head;
draw_line('-');
printf("链表元素为:\n");
while(ptr)
{
printf("%3c",ptr->data);
ptr=ptr->next;
}
draw_line('-');
}
/*释放结点空间*/
void free_list(Linklist head)
{
Linklist temp;
while(head)
{
temp=head;
head=head->next;
free(temp);
}
printf("\n链表结点空间释放成功\n");
}
/*插入新结点*/
Linklist insert_list(Linklist head,Linklist new,ElementType data)
{
Linklist ptr;
ElementType date;
printf("请输入要插入的元素:");
date=getchar();
new->data=date;
ptr=head;
while(1)
{
if(head==NULL)
{
new->next=head;
head=new;
break;
}
else if(ptr->data==data)
{
new->next=ptr->next;
ptr->next=new;
break;
}
else
ptr=ptr->next;
}
return head;
}
/*删除链表中的结点*/
Linklist delete_list(Linklist head,ElementType data)
{
Linklist ptr,prv;
ptr=head;
while(1)
{
if(ptr->next==NULL)
{
printf("没有找到所要删除的元素!\n");
break;
}
if(head->data==data)
{
head=ptr->next;
free(ptr);
break;
}
prv=ptr;
ptr=ptr->next;
if(ptr->data==data)
{
prv->next=ptr->next;
free(prv);
break;
}
}
return head;
}
/*修改结点的数据域*/
Linklist modify_list(Linklist head,ElementType data)
{
Linklist ptr;
ElementType date;
ptr=head;
while(1)
{
if(ptr->next==NULL)
{
printf("没有找到所要修改的元素!\n");
break;
}
else if(head->data==data)
{
fflush(stdin);
printf("请输入覆盖%c的元素:",data);
scanf_s("%c",&date);
ptr->data=date;
fflush(stdin);
break;
}
else if(ptr->data==data)
{
fflush(stdin);
printf("请输入覆盖%c的元素:",data);
scanf_s("%c",&date);
ptr->data=date;
fflush(stdin);
break;
}
else
ptr=ptr->next;
}
return head;
}
/*链表的转置*/
Linklist invert_list(Linklist head)
{
Linklist ptr,prv,next;
prv=head;
ptr=prv->next;
prv->next=NULL;
next=ptr->next;
ptr->next=prv;
prv=ptr;
ptr=next;
while(ptr->next)
{
next=ptr->next;
ptr->next=prv;
prv=ptr;
ptr=next;
}
ptr->next=prv;
return head;
}
/*单链表主函数*/
int main()
{
Linklist head=0, new;
ElementType data;
int choose=-1; /*在这要加head=null;*/
int clrscr();
draw_line('*');
head=creat_list(head);
print_list(head);
while(1)
{
printf("+-----------------------Menu-----------------------------------+\n");
printf("| 1、插入 2、删除 3、修改 4、转置 5、释放 0 退出 | \n");
printf("+-----------------------Menu-----------------------------------+\n");
printf("请选择(0--5):");
scanf_s("%d",choose);
switch(choose)
{
case 0:
exit(0);
break;
case 1:
new=(Node*) malloc(sizeof(Node));
new->next=NULL;
fflush(stdin);
printf("\n请输入在这个元素后面:");
scanf_s("%f",&data);
fflush(stdin);
head=insert_list(head,new,data);
print_list(head);
break;
case 2:
fflush(stdin);
printf("\n请输入要删除的元素:");
scanf_s("%f",&data);
fflush(stdin);
head=delete_list(head,data);
print_list(head);
break;
case 3:
fflush(stdin);
printf("\n请输入你所要修改的元素:");
scanf_s("%f",&data);
fflush(stdin);
head=modify_list(head,data);
print_list(head);
break;
case 4:
head=invert_list(head);
print_list(head);
break;
case 5:
free_list(head);
break;
default:
printf("\n非法选择!\n");
break;
}
}
return 0;
}