1. 程式人生 > >鏈表節點的刪除(鏈表data升序有重復)

鏈表節點的刪除(鏈表data升序有重復)

color ant 升序 del 大於 fin printf 逆向 一個

#include<stdio.h>

#include<stdlib.h>

#define N 9

typedef struct node{

int data;

struct node * next;

}ElemSN;

ElemSN * Createlink(int a[]){ //逆向創建單向鏈表

int i;

ElemSN * h=NULL, * p;

for( i=N-1;i>=0;i--){

p=(ElemSN *)malloc(sizeof(ElemSN));

p->data =a[i];

p->next=h;

h=p;

}

return h;

}

void Printlink(ElemSN * h){

ElemSN * p;

for(p=h;p;p=p->next)

printf("%2d\n",p->data);

}

ElemSN * DelSameNode(ElemSN*h){

ElemSN * p,* q;

q=h;

p=h->next ; //p指針從頭結點的下一個節點開始

while(p){

if(p->data!=q->data){ //升序排列,後面的data都大於等於當前節點data

q=p; //(q指針指的是當前節點,p指針指著與當前節點要比較的結點)

p=p->next; // 不相等表示當前結點不重復,p指針後移,q指針聯動

}

else{ //如果相等,就斷鏈

q->next=p->next;

free(p); //先釋放p,p再後移,否則剩余的鏈就掛在了p指針後面以釋放後面的鏈就找不到頭指針,屬於遊離狀態

p=q->next;

}

}

return h;

}

int main(void) {

int a[]={2,2,3,3,4,4,5,5,6};

ElemSN * head;

head=Createlink(a,9);

head=DelSameNode(head);

Printlink(head);

}


鏈表節點的刪除(鏈表data升序有重復)