1. 程式人生 > >已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表中值相同的多餘元素

已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構,設計一個演算法,刪除表中值相同的多餘元素

/* 已知線性表中元素以值遞增有序排列,並以單鏈表作為儲存結構
* 設計一個演算法,刪除表中值相同的多餘元素
* 使得操作後表中所用元素值均不同,同時釋放被刪除的結點空間
*/

#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; }

執行結果