1. 程式人生 > >c語言——連結串列的基本操作

c語言——連結串列的基本操作

#include <stdio.h>
typedef int ElementType;
typedef struct ListNode{
int k;
ElementType element;
struct ListNode *m_pNext;

}ListNode,*PNODE;

//在k處插入元素

ListNode *FindKthToTail(ListNode *pListHead, unsigned int k)
{
if (pListHead == NULL)
{
return NULL;
}

ListNode *pAhead = pListHead;
ListNode *pBehind = NULL;
for (int i = 0; i < k - 1; i++)
{
pAhead = pAhead->m_pNext;
}
pBehind = pListHead;
while (pAhead->m_pNext != NULL)
{
pAhead = pAhead->m_pNext;
pBehind = pBehind->m_pNext;
}

return pBehind;

}

//建立連結串列

PNODE CreateList(int lens)
{
int data;
PNODE  pHead = (PNODE)malloc(sizeof(ListNode));
if (pHead == NULL)
{
printf("分配空間失敗請重新分配\n");
exit(-1);
}
PNODE pTail = pHead;
pTail->m_pNext = NULL;
printf("開始分配連結串列個數\n");
for (int i = 0; i < lens; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(ListNode));
if (pNew == NULL)
{
printf("空間分配失敗\n");
exit(-1);
}
printf("請輸入第%d個數據", i + 1);
scanf_s("%d", &data);
pNew->element = data;
pTail->m_pNext = pNew;
pNew->m_pNext=NULL;
pTail = pTail->m_pNext;
}
printf("建立連結串列成功\n");
return pHead;

};

//將兩個連結串列連線在一起

 PNODE ADDList(ListNode *head1, ListNode *head2)
{
ListNode *pr;
pr = head1;
while(pr->m_pNext!=NULL)
{
pr = pr->m_pNext;
}
pr->m_pNext= head2->m_pNext;
/*head2 = NULL;*/
/*printf("輸出合併後的兩個連結串列\n");*/
/*while (pr->m_pNext != NULL)
{
printf("%d", pr->m_pNext->element);
pr = pr->m_pNext;
}*/
return head1;
};
 //連結串列查詢
 PNODE findList(ListNode *list,int val)
 {
PNODE p = list;
if (p->m_pNext == NULL)
{
return;
}
 
/*int val;*/
int num = 0;
/*printf("輸入要查詢的數:\n");
scanf_s("%d", &val);*/
while(p !=NULL&& p->element!=val)
{
p = p->m_pNext;
num++;
}
if (p != NULL)
{
printf("這個數在第%d個數:", num + 1);
}
else 
{
printf("沒有找到這個節點");
}
printf("\n");
 }
 //連結串列插入
 void InsertList(ListNode *list, int pos, int val)
 {
int position = 0;
PNODE p = list;
while (p->m_pNext != NULL && position < pos)
{
p = p->m_pNext;
position++;
}
PNODE tmp = (PNODE)malloc(sizeof(PNODE));
tmp->element = val;
tmp->m_pNext = p->m_pNext;
p->m_pNext = tmp;
 
 }
 //連結串列刪除
 void deleteAllListNode(ListNode *list)
 {
PNODE p,tmp;
p = list->m_pNext;
list->m_pNext = NULL;
while (p != NULL)
{
tmp = p->m_pNext;
free(p);//刪除第一個節點
p = tmp;
}
printf("連結串列刪除成功");
 }
 //刪除指定節點
 void deleListNode(ListNode *list, int pos)
 {
int position = 0;
PNODE p;
p = list;
while (p != NULL && position < pos-1)
{
p = p->m_pNext;
position++;
}
PNODE tmp = p->m_pNext;
p->m_pNext = tmp->m_pNext;
free(tmp);
tmp = NULL;


 }
 //    定義連結串列遍歷函式
 void TraverseList(ListNode *List) {
PNODE P = List->m_pNext;    //    首節點賦值給臨時節點P
printf("遍歷連結串列的值為:");
if (P == NULL)
printf("連結串列為空");
while (P != NULL)        //當臨時節點P不為尾節點時,輸出當前節點值 
{
printf("%d ", P->element);
P = P->m_pNext;
}
printf("\n");
 }
 int main() {
int lens = 6;
printf("建立列表1\n");
PNODE list1 = CreateList(lens);
printf("建立列表2\n");
PNODE list2 = CreateList(lens);
int k = 2;
struct ListNode *t;
printf("找到倒數第k個數\n");
t = FindKthToTail(list1, k);
printf("倒數第%d個數是%d\n", k, t->element);
PNODE list;
printf("合併兩個列表\n");
list = ADDList(list1, list2);
printf("遍歷列表\n");
TraverseList(list);
printf("找到第數字為3\n");
findList(list, 3);
printf("在第六個地方插入\n");
InsertList(list, 6, 11111);
TraverseList(list);
printf("在第六個地方刪除\n");
deleListNode(list, 6);
TraverseList(list);
printf("刪除整個列表\n");
deleteAllListNode(list);
return 0;
 }

相關推薦

C語言連結串列各類操作詳解

          連結串列概述    連結串列是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。連結串列有一個“頭指標”變數,以head表示,它存放一個地址。該地址指向一個元素。連結串列中每一個元素稱為“結點”,每個結點都

C語言單向連結串列基本操作

資料結構練習 “` typedef struct node{ int data; struct node * next; } Node; void Create(Node**); void Output(Node*); No

c語言——連結串列基本操作

#include <stdio.h>typedef int ElementType;typedef struct ListNode{int k;ElementType element;struct ListNode *m_pNext;}ListNode,*PNOD

C語言 連結串列基本操作實現 原始碼

1 創作初衷   作為一個畢業半年,到公司上班的菜鳥程式猿,卻還沒有參與過一次實際的專案開發,沒有跟著專案寫過一行程式碼, 每天除了自學,就是做做文件之類的工作。所以在此,把之前學過的知識重新拿起來,寫成文章。   本文屬於作者 原創,轉載請註明出處!哦,也許並沒有人能看上

靜態連結串列基本操作C語言實現)詳解

上節,我們初步建立了一個靜態連結串列,本節學習有關靜態連結串列的一些基本操作,包括對錶中資料元素的新增、刪除、查詢和更改。 本節是建立在已能成功建立靜態連結串列的基礎上,因此我們繼續使用上節中已建立好的靜態連結串列學習本節內容,建立好的靜態連結串列如圖 1 所示: 圖 1 建立好的靜態連結串列 靜態

C語言連結串列:遍歷,頭插,尾插,中間插入;頭節點刪除,尾節點刪除,中間刪除的操作

/****************************************************************************************************************************************

資料結構C/C++程式碼實現 棧連結串列基本操作

實現棧連結串列基本操作: #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct linknode {     ElemType data;     stru

C語言連結串列的5種常見操作

C語言連結串列的5種常見操作 單鏈表反轉 連結串列中環的檢測 兩個有序的連結串列合併 刪除連結串列倒數第n個結點 求連結串列的中間結點 Ref typedef struct list{ int i

C語言連結串列實現佇列操作

還是操作佇列,但是這次換成連結串列,但是要注意出隊的操作。 一般的思維是在出隊的時候,刪除頭結點的下一個節點,這樣的話確實可以將佇列中的節點全部刪除,但是如果我們將最後一個節點刪除的時候,我們的演算法就將tail指標賦值為NULL,這時如果再進行入隊操作的時候,就會發生段錯

C語言連結串列就地逆置操作

在c語言中,為了節省空間和時間,我們可以採取在原空間上實現連結串列的逆置 每次讀取一個節點時,將他用頭插法的方法加入到連結串列中,最後得到的即是逆置後的連結串列了 關鍵掌握頭插法的思路: q->next=l->next; l->next=q; 下面

無頭單向非迴圈連結串列基本操作實現

之前寫了動態順序表的實現,但動態順序表還是存在以下問題 中間/頭部的插入刪除,時間複雜度為O(N) 增容需要申請新空間,拷貝資料,釋放舊空間。會有不小的消耗。 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當前容量為100,滿了以後增容到200, 我們再繼續插入

C語言連結串列(超詳細)

前言:之前學習連結串列的時候總會遇到一些問題 也看了好多人的文章感覺有些不是太實用 然後後來也是自己摸索才大概寫出來的. 在真正的開發中會把連結串列的增刪改查寫到函式裡 但是刪除有點麻煩 找了很多都是刪除第幾個 而不是刪除某個值對應的節點 讓我很難受 所以想寫一些連結串列的操作分享

使用C語言連結串列實現商品管理系統

#include <stdio.h> #include <stdlib.h> #include <windows.h> #define bool char #define true 1 #define false 0 #define NUM 1

5 種排序演算法--C語言連結串列

原始碼地址 GitHub:https://github.com/GYT0313/C-DataStructure/blob/master/sortIn5.c 包括: 氣泡排序 快速排序 選擇排序 插入排序 希爾排序 執行: 注意:

C++ 迴圈連結串列基本演算法

C++ 迴圈連結串列基本演算法 #ifndef CLinkList_h #define CLinkList_h #include <iostream> using namespace std; template <class T> struct Node{ T data

C++ 靜態連結串列基本演算法實現

C++ 靜態連結串列基本演算法實現 #ifndef StaticLinkList_h #define StaticLinkList_h const int MAXSIZE = 100; template <class T> struct StaticNode{ T data;

1870 Problem B C語言-連結串列排序

問題 B: C語言-連結串列排序 時間限制: 1 Sec  記憶體限制: 128 MB 提交: 86  解決: 71 [提交][狀態][討論版][命題人:外部匯入] 題目描述 已有a、b兩個連結串列,每個連結

資料結構之雙向迴圈連結串列基本操作

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#define TRUE 1#define OK 1#define FALSE 0#define ERROR 0#def

C語言連結串列的建立插入等綜合實戰

系本人原創,轉載請註明出處: 程式設計老師讓寫一個連結串列的綜合運用,包括建立,檢視某個節點,刪除某個節點,插入某個節點,以及連結串列的逆序,還必須要有出錯提示和返回。QaQ,,,看見這麼多東西我就想嚶嚶嚶, 先放上鍊表的結構體: typedef struct stud

資料結構之連結串列基本操作

涉及到單鏈表的基本操作有如下: int initList(linkList *);  //初始化一個單鏈表,具有頭指標,頭結點,頭結點->next=NULL; int createListHead(linkList *, int n);  //頭插法建立一個連