已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表中值相同的多餘元素
阿新 • • 發佈:2018-12-24
/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構
* 設計一個演算法,刪除表中值相同的多餘元素
* 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間
*/
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data;
struct Node * next;
}Node,*LinkList;
// 單鏈表的初始化
Status InitLinkList(LinkList * L)
{
(*L)=(LinkList)malloc(sizeof(Node));
if((*L)==NULL)
{
printf("記憶體分配失敗!\n");
return 0;
}
(*L)->next=NULL;
return OK;
}
//單鏈表的建立
Status Create(LinkList * L,int n)
{
LinkList P,Q;
ElemType Elem;
Q=(*L);
printf ("請按遞增順序輸入元素:\n");
for(int i=0;i<n;i++)
{
P=(LinkList)malloc(sizeof(Node));
scanf("%d",&Elem);
P->data=Elem;
Q->next=P;
Q=P;
}
P->next=NULL;
return OK;
}
//刪除結點
Status Delete(LinkList * L,int Location)
{
LinkList Q,P;
int count=0;
int k=Location+1;
Q=(*L);
P=(*L)->next;
while(P->next)
{
Q=Q->next;
P=P->next;
count++;
if(count==Location)
{
Q->next=P->next;
}
}
return OK;
}
//定位刪除結點的位置並刪除
Status Locate(LinkList * L)
{
LinkList First,Second;
int count=1;
First=(*L)->next;
Second=(*L)->next->next;
while(Second)
{
if(First->data==Second->data)
{
Delete(L,count);
Second=Second->next;
}
else
{
count++;
First=First->next;
Second=Second->next;
}
}
return OK;
}
void Print(LinkList * L)
{
LinkList P;
P=(*L)->next;
while(P)
{
printf("%d ",P->data);
P=P->next;
}
printf("\n");
}
int main()
{
LinkList L;
int Number;
InitLinkList(&L);
printf("請輸入元素個數:\n");
scanf("%d",&Number);
Create(&L,Number);
printf("輸出連結串列:\n");
Print(&L);
Locate(&L);
printf("輸出去掉相同元素後連結串列:\n");
Print(&L);
return 0;
}