1. 程式人生 > 實用技巧 >刪除連結串列第index個結點

刪除連結串列第index個結點

問題描述 :

輸入若干(不超過100個)非負整數,建立一個不帶頭結點的單向連結串列。在輸入一個位置index,從連結串列中刪除第index個結點,輸出結果連結串列。

請編寫deleteNode函式,完成刪除操作。deleteNode函式的原型如下:

struct student *deleteNode(struct student *head,int index)

形參:

struct student *head:連結串列的頭指標,需要從這個連結串列中刪除

int index:從連結串列中刪除第index個結點。index從1開始編號。

返回值:

函式返回結果連結串列的頭指標。

輸入說明 :

首先輸入若干非負整數,每個整數作為資料放入一個連結串列結點中,輸入-1表示輸入結束。

然後輸入若干組整數,每組一行,每行僅包含一個整數,表示需要刪除的結點的位置index。如:輸入1表示刪除連結串列的第一個(最前面一個)結點。

輸出說明 :

對於每組輸入,輸出刪除第index個結點之後的結果連結串列。輸出的資訊以head開頭,以tail結尾,以“-->”分隔。具體見輸出範例。

如果輸入的index超出了連結串列的範圍,則不刪除,輸出原連結串列。如果是空連結串列,則直接輸出“head-->tail”。

輸入範例 :

1000 2342 8883 -1
4
3
1
1

輸出範例 :

head-->1000-->2342-->8883-->tail

head-->1000-->2342-->tail
head-->2342-->tail
head-->tail

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
struct student
{
    int  num;
    struct student* next;
};
//從鍵盤讀入資料建立連結串列,新結點插入到尾部
struct student* createByTail()
{
    struct student* head;
    
struct student* p1, * p2; int n; n = 0; p1 = p2 = (struct student*)malloc(sizeof(struct student)); scanf("%d", &p1->num); head = NULL; //首先置連結串列為空連結串列 while (p1->num != -1) //num為-1,意味著使用者輸入結束 { n = n + 1; if (n == 1) //建立第一個結點 head = p1; else p2->next = p1; p2 = p1; //p2始終指向最後一個結點(即尾指標) p1 = (struct student*)malloc(sizeof(struct student)); //p1指向新結點 scanf("%d", &p1->num); } p2->next = NULL; //切記:最後一個結點的next賦值為NULL return head; } //輸出連結串列中的資訊(num) void displayLink(struct student* head) { struct student* p; p = head; printf("head-->"); while (p != NULL) { printf("%d-->", p->num); p = p->next; } printf("tail\n"); } //刪除連結串列中第index個結點。index從1開始。 //由於可能刪除第一個結點,所以函式返回頭指標給主調函式 struct student* deleteNode(struct student* head, int index) { if (!head) return head; struct student* p = head,*q; if (index == 1)//刪除第一個結點 { q = head; head = head->next; free(q); return head; } else//刪除其他節點 { int i = 1; while (p->next) { if (i == index - 1) { q = p->next; p->next = q->next; if(q)free(q); break; } i++; p = p->next; } return head; } } int main() { struct student* head; int index; head = createByTail(); while (scanf("%d", &index) != -1) { head = deleteNode(head, index); displayLink(head); } }