Ⅰ 求C語言大神解一下這道簡單的鏈表題
/*Description
給定一串數字,用鏈表結構進行存儲。然後給定針對該鏈表的若干插入操作,要求將執行插入操作後的結果輸出。
Input
第一行:輸入一個整數n,表示這串數字有n個(n大於等於1)。
第二行:輸入這n個整數。
第三行:輸入一個整數m,表示需要執行m個插入操作。
後面m行:每行輸入兩個整數a和b,表示在這串數字的當前第a個數字之後插入數字b。(假設鏈表第一個節點編號為1)
Output
輸出操作後雀稿的n+m個數字。每個數字用空格空開。
Sample Input
3
2 1 3
2
1 5
1 6
Sample Output
2 6 5 1 3
HINT
最後一個輸出數字的後面沒有空格
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
//節點結構
struct Node
{
int data; //數據
Node *next; //指向下一個節點
};
//創建鏈表頭部,iData為數據
Node * CreateHead(int iData)
{
Node *pNode = new Node;
if (NULL == pNode) return NULL;
pNode->data = iData;
pNode->next = NULL;
return pNode;
}
//釋扮歲巧放內存
void ClearList(Node *pHead)
{
Node *pNode = pHead;
while(NULL != pNode)
{
Node *pNext = pNode->next;
delete pNode;
pNode = pNext;
}
}
//列印鏈表數據
void PrintList(Node *pHead)
{
Node *pFindNode = pHead;
printf("\n-----------------鏈表數據列印--------------------\n");
while(NULL != pFindNode)
{
printf("%d\t", pFindNode->data);
pFindNode = pFindNode->next;
}
printf("\n----------------------END------------------------\n");
}
//插入節點函數,每次都返回鏈表頭節點
Node *InsertData(int index, int data, int size, Node *pHead)
{
int i = 0;
Node *pFindNode = NULL;
Node *pNode = NULL;
//參數檢查
if (NULL == pHead) return CreateHead(data);
if((index < 1) || (index > size)) return NULL;
//廳鍵創建新節點
pNode = new Node;
if(NULL == pNode) return NULL;
pNode->data = data;
pNode->next = NULL;
//定位插入節點
pFindNode = pHead;
while(((index--) > 1) && (NULL != pFindNode->next))pFindNode = pFindNode->next;
//執行插入操作
Node *pNext = pFindNode->next;
pFindNode->next = pNode;
pNode->next = pNext;
return pHead;
}
int main(void)
{
int i = 0; //鏈表索引
int iData = 0; //節點存儲數據
Node *pHead = NULL; //鏈表首部
int N = 0; //鏈表初始個數
int M = 0; //插入數據的個數
int size = 0; //鏈表的當前數據個數
//輸入鏈表的初始元素個數
printf("請輸入鏈表的容量(正整數>0):");
scanf("%d", &N);
//插入初始的數據
printf("請輸入%d個整數(以空格分開):", N);
for(i = 0; i < N; ++i)
{
scanf("%d", &iData);
pHead = InsertData(i, iData, size, pHead); //開始插入節點,初次會創建頭部
size++;//當前鏈表元素個數增1
}
//輸入插入操作的次數
printf("請輸入插入整數的個數(正整數>0):");
scanf("%d", &M);
//執行插入操作
while((M--) > 0)
{
printf("請輸入一組插入操作(1<=index<=%d data):", N);
scanf("%d%d", &i,&iData);
pHead = InsertData(i, iData, size, pHead);
size++;
}
//列印數據
PrintList(pHead);
//清空內存
ClearList(pHead);
getch();
return 0;
}
Ⅱ 鏈表習題(C語言)
設鏈表長度為n,找到倒數第m個元素(約定0為最後一個元素),也就是找到正數第n - m - 1個元素,計數方法當然也是從0開始。
#include<stdio.h>
#include<stdlib.h>
typedefintDataType;
typedefstructlist{
DataTypeelem;
structlist*next;
}*LIST,*pNode;
LISTInitList(){
LISTL=(pNode)malloc(sizeof(structlist));
L->elem=0;
L->next=NULL;
returnL;
}
voidCreateList(LISTL,DataTypea[],intn){
inti;
pNodep=L;
for(i=0;i<n;++i){
p->next=(pNode)malloc(sizeof(structlist));
p->next->elem=a[i];
p=p->next;
}
p->next=NULL;
}
intlenList(LISTL){//求取表長
intlen=0;
pNodep=L->next;//有頭結點
while(p){++len;p=p->next;}
returnlen;
}
intGetData(LISTL,intm,DataType*e){
inti=-1,len=lenList(L);
pNodep=L->next;
if(m<0||m>len-1){
printf("沒有第%d個元素。 ",m);
return0;
}
while(i<len-m-1){++i;p=p->next;}
*e=p->elem;
return1;
}
intmain(){
DataTypearr[]={16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
intn,m,res;
LISTL=InitList();
n=sizeof(arr)/sizeof(arr[0]);
CreateList(L,arr,n);
while(scanf("%d",&m)==1){
if(GetData(L,m,&res))
printf("倒數第%d元素是:%d. ",m,res);
}
return0;
}