主题:单链表表的倒置 删除相同的元素 排序操作
昨天晚上写了个程序 发到上面 没有多少人帮忙解决
今天修改好了 发到上面大家看看 如果有好的建议 可以给我留言谢谢
如果是初学者可以参考一下 程序 相互学习一下
可以运行的 验证基本正确(还有点问题 希望大家纠正)
#include"stdio.h"
#define N 10 /*代表要处理的元素个数*/
#define OK 1
#define NULL 0
#define OVERFLOW 0
typedef int ElemType;
typedef int status;
typedef struct Node{ ElemType data;
struct Node *next;
}Node,*LinkList;
status InitLinkList(LinkList *L) /*初始化单链表*/
{ Node *p,*q;
int i;
*L=(LinkList)malloc(sizeof(Node));
printf("请输入元素"); /*元素个数为N*/
if(!L)
{ printf("out of memory");
exit(OVERFLOW);
}
(*L)->next=NULL;
p=L;
for(i=N;i>0;i--)
{ q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
scanf("%d",&(q->data));
q->next=NULL;
p->next=q;
p=q;
}
return (L);
}
status LinkListSort(LinkList L) /*对单链表的元素进行排序*/
{ Node *p;
int t ,i=0;
while(i<(N*(N-1)/2))
{ p=L->next;
while (p->next!=NULL) /*N为元素个数 元素要比较N*(N-1)/2次*/
{ if(p->data>p->next->data) /*相互之间换值*/
{ t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
}
i++;}
return OK;
}
status DeleteSameElement (LinkList L) /*删除相同的元素*/
{ Node *p,*q;
int e;
p=L->next;
while(p!=NULL)
{ q=p;
e=p->data;
p=p->next;
while(p!=NULL)
{ if(e==p->data) /*将相同的元素赋值为0 在下面判断如果元素值为0 释放这个接点*/
p->data=0;
p=p->next;
}
p=q;
p=p->next;
}
p=L;
while(p!=NULL)
{
if(p->next->data==0)
{
q=p->next;
p->next=q->next;
free(q);
}
p=p->next;
}
return OK;
}
status LinkListReverse(LinkList L) /*对单链表中的元素倒置*/
{ int a[N] ,i=0,count=0;
LinkList Lb;
Node *p,*q;
p=L->next;
while(p!=NULL)
{
a[i++]=p->data;
p=p->next;
count++;
}
Lb=(LinkList)malloc(sizeof(Node)); /*重新建立一个单链表 将倒置后的元素放在Lb中*/
{ if(Lb==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
Lb->next=NULL;
p=Lb;
for(i=count-1;i>=0;i--)
{q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
q->data=a[i];
q->next=NULL;
p->next=q;
p=q;
}
}
p=Lb->next; /*输出倒置后的单链表*/
while(p!=NULL)
{ printf("%4d",p->data);
p=p->next;}
return OK;
}
status FreeLinkList(LinkList L) /*释放接点*/
{ Node *p,*q;
p=L;
while(p->next!=NULL)
{ q=p;
p=p->next;
free(q);
}
return OK;
}
status PrintLinkList(LinkList L) /*打印出单链表*/
{ Node *p;
p=L->next;
printf("处理之后的单链表为:");
while(p!=NULL)
{ printf("%4d",p->data);
p=p->next;}
getchar();
return OK;
}
今天修改好了 发到上面大家看看 如果有好的建议 可以给我留言谢谢
如果是初学者可以参考一下 程序 相互学习一下
可以运行的 验证基本正确(还有点问题 希望大家纠正)
#include"stdio.h"
#define N 10 /*代表要处理的元素个数*/
#define OK 1
#define NULL 0
#define OVERFLOW 0
typedef int ElemType;
typedef int status;
typedef struct Node{ ElemType data;
struct Node *next;
}Node,*LinkList;
status InitLinkList(LinkList *L) /*初始化单链表*/
{ Node *p,*q;
int i;
*L=(LinkList)malloc(sizeof(Node));
printf("请输入元素"); /*元素个数为N*/
if(!L)
{ printf("out of memory");
exit(OVERFLOW);
}
(*L)->next=NULL;
p=L;
for(i=N;i>0;i--)
{ q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
scanf("%d",&(q->data));
q->next=NULL;
p->next=q;
p=q;
}
return (L);
}
status LinkListSort(LinkList L) /*对单链表的元素进行排序*/
{ Node *p;
int t ,i=0;
while(i<(N*(N-1)/2))
{ p=L->next;
while (p->next!=NULL) /*N为元素个数 元素要比较N*(N-1)/2次*/
{ if(p->data>p->next->data) /*相互之间换值*/
{ t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;
}
i++;}
return OK;
}
status DeleteSameElement (LinkList L) /*删除相同的元素*/
{ Node *p,*q;
int e;
p=L->next;
while(p!=NULL)
{ q=p;
e=p->data;
p=p->next;
while(p!=NULL)
{ if(e==p->data) /*将相同的元素赋值为0 在下面判断如果元素值为0 释放这个接点*/
p->data=0;
p=p->next;
}
p=q;
p=p->next;
}
p=L;
while(p!=NULL)
{
if(p->next->data==0)
{
q=p->next;
p->next=q->next;
free(q);
}
p=p->next;
}
return OK;
}
status LinkListReverse(LinkList L) /*对单链表中的元素倒置*/
{ int a[N] ,i=0,count=0;
LinkList Lb;
Node *p,*q;
p=L->next;
while(p!=NULL)
{
a[i++]=p->data;
p=p->next;
count++;
}
Lb=(LinkList)malloc(sizeof(Node)); /*重新建立一个单链表 将倒置后的元素放在Lb中*/
{ if(Lb==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
Lb->next=NULL;
p=Lb;
for(i=count-1;i>=0;i--)
{q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
{ printf("out of place");
exit(OVERFLOW);
}
q->data=a[i];
q->next=NULL;
p->next=q;
p=q;
}
}
p=Lb->next; /*输出倒置后的单链表*/
while(p!=NULL)
{ printf("%4d",p->data);
p=p->next;}
return OK;
}
status FreeLinkList(LinkList L) /*释放接点*/
{ Node *p,*q;
p=L;
while(p->next!=NULL)
{ q=p;
p=p->next;
free(q);
}
return OK;
}
status PrintLinkList(LinkList L) /*打印出单链表*/
{ Node *p;
p=L->next;
printf("处理之后的单链表为:");
while(p!=NULL)
{ printf("%4d",p->data);
p=p->next;}
getchar();
return OK;
}