問題描述 :
輸入若干(不超過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:鏈表的頭指針,需要插入到這個鏈表中
struct student *s:指向需要插入的結點
int index:插入位置。index從1開始編號。如果鏈表中已有n個結點,則index的有效范圍為 1<= index <= n+1。
返回值:
函數返回結果鏈表的頭指針
輸入說明 :
首先輸入若干非負整數,每個整數作為數據放入一個鏈表結點中,輸入-1表示輸入結束。
然后輸入若干組整數,每組一行,每行包含兩個整數,第一個表示需要插入位置index,第二個為新結點的數據。如:輸入“1 5”表示在鏈表的第一個位置(最前面)插入一個結點,結點的數據為5。
輸出說明 :
對於每組輸入,輸出插入結點之后的結果鏈表。輸出的信息以head開頭,以tail結尾,以“-->”分隔。具體見輸出范例。
如果輸入的index超出了鏈表的范圍(如果鏈表中已有n個結點,則index的有效范圍為 1<= index <= n+1),則不插入,輸出原鏈表。如果是空鏈表,則直接輸出“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; }
