在連結串列指定位置插入結點
阿新 • • 發佈:2020-06-27
問題描述 :
輸入若干(不超過100個)非負整數,建立一個不帶頭結點的單向連結串列。
再輸入一個位置index以及一個數據data,程式中首先建立一個新結點s,s的資料成員為data,然後呼叫函式insertNode將s插入到連結串列的指定位置index處,最後輸出結果連結串列。
請編寫insertNode函式,完成插入操作。insertNode函式的原型如下:
struct student *insertNode(struct student *head, struct student *s, int index)
形參:
struct student *head:連結串列的頭指標,需要插入到這個連結串列中
int index:插入位置。index從1開始編號。如果連結串列中已有n個結點,則index的有效範圍為 1<= index <= n+1。
返回值:
函式返回結果連結串列的頭指標
輸入說明 :
首先輸入若干非負整數,每個整數作為資料放入一個連結串列結點中,輸入-1表示輸入結束。
然後輸入若干組整數,每組一行,每行包含兩個整數,第一個表示需要插入位置index,第二個為新結點的資料。如:輸入“1 5”表示在連結串列的第一個位置(最前面)插入一個結點,結點的資料為5。
輸出說明 :
對於每組輸入,輸出插入結點之後的結果連結串列。輸出的資訊以head開頭,以tail結尾,以“-->”分隔。具體見輸出範例。
輸入範例 :
1 2 3 -1
1 10
3 20
輸出範例 :
head-->10-->1-->2-->3-->tail
head-->10-->1-->20-->2-->3-->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處插入s指標所指向的結點。index從1開始。 //由於可能插在第一個結點,所以函式返回頭指標給主調函式 //head 是不帶頭結點的連結串列 struct student* insertNode(struct student* head, struct student* s, int index) { if (!head && index != 1)return head;//處理空連結串列 if (index == 1)//處理插在頭 { s->next = head; return s; } else { struct student* p = head,*q; int i = 1; while (p->next)//正常插入 { if (i == index - 1) { s->next = p->next; p->next = s; break; } i++; p = p->next; } if (!p->next&&i==index-1)//插入到尾 { p->next = s; s->next = NULL; } return head; } } int main() { struct student* head; int index, data; head = createByTail(); while (scanf("%d%d", &index, &data) != -1) { struct student* s = (struct student*)malloc(sizeof(struct student)); s->num = data; head = insertNode(head, s, index); displayLink(head); } return 0; }