数据结构之SWUSTOJ1038: 顺序表中重复数据的删除
生活随笔
收集整理的這篇文章主要介紹了
数据结构之SWUSTOJ1038: 顺序表中重复数据的删除
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
?
思路:
這個題目相對來說主要思路在于SLPop這個函數的設計上。
如果找到了等于m的數,那么需要分情況來討論:
第一種情況就是普通情況,也就是在中間找到等于m的數,那么之需要把每個數依次向前挪動一個位置即可,并且這是的size要減少一個。
第二種情況就是在末尾的時候找到等于m的數,這時就不能夠再去把后面的數移動在前面來,因為這樣就會造成數組訪問越界,只需要把size較少一個即可。
還需要注意的一個問題:
當每一次找到等于m的數時,我們都完成了后數的移動到前面的過程,那么這時我們需要用continue來跳過后面的i++這一步,因為還得繼續判定后面移到這個位置上面來的數是否等于m,如果不等于那么直接i++即可。
代碼:
#include<stdio.h> #include<stdlib.h> #define N 100 typedef struct SList {int data[N];int size; }SL; void SLInit(SL* ps) {ps = (SL*)malloc(sizeof(SL));ps->size = 0; } void SLCreate(SL* ps, int n) {int x = 0;ps->size = n;for (int i = 0; i < ps->size; i++){scanf("%d", &x);getchar();ps->data[i] = x;} } void SLPop(SL* ps, int m) {int i = 0;while (i < ps->size){if (ps->data[i] == m){if (ps->size == i){ps->size--;}//這里主要是處理當最后一個數等于m時else{int j = i;while (j + 1 < ps->size){ps->data[j] = ps->data[j + 1];j++;}ps->size--;}continue;//如果等于m時處理完過后,將后面的數依次向前移動一個位置//跳出本次循環,主要是為了不讓i完后移動//因為不確定從后面移動過來的數是否等于m}i++;//i不斷向后迭代} } void SLPrint(SL* ps) {for (int i = 0; i < ps->size; i++){printf("%d ", ps->data[i]);} } int main() {SL plist;SLInit(&plist);int n = 0;scanf("%d", &n);getchar();SLCreate(&plist, n);int m = 0;scanf("%d", &m);SLPop(&plist, m);if (plist.size == 0){printf("-1");}else{SLPrint(&plist);}return 0; }總結
以上是生活随笔為你收集整理的数据结构之SWUSTOJ1038: 顺序表中重复数据的删除的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java mysql 分区表_mysql
- 下一篇: pata1038