這兩天在復習C語言的知識,為了給下個階段學習OC做准備,以下的代碼的編譯運行環境是Xcode5.0版本,寫篇博文把昨天復習的C語言有關鏈表的知識給大家分享一下,以下是小菜自己總結的內容,代碼也是按照自己的思路所編寫的,有不足之處還請大牛們批評指教。
確切的說鏈表屬於數據結構中線性表中的內容,在鏈表中存儲的內容是按線性排列的,就像是一條線把所要存的數據串起來,可以把鏈表類比成一串珠子,數據就是一個個的珠子,數據間的next指針就相當於穿珠子的線。
鏈表操作的時間復雜度: 往鏈表中插入數據的時間復雜度為O(1)。
想真正的理解鏈表及在C語言中的表示方法的前提是理解C語言中的指針和結構體,閒話少說,進代碼才是關鍵,代碼中基本上都有注釋
1.用結構體定義鏈表的節點
1 //定義鏈表中的節點
2 typedef struct node{
3 //存儲數據
4 int data;
5 //指向下一個節點
6 struct node *next;
7 }Node;
2.定義鏈表的整體結構,存放鏈表的節點和鏈表中的信息
//定義鏈表結構
typedef struct {
//存放頭節點
Node *head;
//記錄節點的個數
int count;
}List;
3.鏈表的初始化,給鏈表分配頭結點,節點個數初始化為0
/************************************************
*功能:初始化鏈表,分配頭結點,結點個數為0
*參數:鏈表指針
*作者:Mr.li
*日期:14-07-23
************************************************/
void initLinkList(List *list)
{
//給頭節點分配內存
list->head = malloc(sizeof(Node));
//頭結點的下一個節點為空
list->head->next = NULL;
//總節點個數為0
list->count = 0;
}
4.建立單項鏈表,這裡為了簡單起見,把要存入數據先存入到array中,下面我是用逆序的方法來創建鏈表的,是從head節點後插入數據,也可以用順序建鏈表,從鏈表的後面插入數據
/************************************************
*功能:逆序建立鏈表,從頭結點後插入
*參數:鏈表指針
*作者:Mr.li
*日期:14-07-23
************************************************/
void createLinkList(List *list)
{
//建立鏈表用到的數據
int a[10] = {1,2,3,4,5,6,7,8,9,10};
//臨時節點指針用於分配節點內存
Node *p;
for (int i = 0; i < 10; i++)
{
//給新的節點分配內存
p = (Node *)malloc(sizeof(Node));
//給新節點賦值
p->data = a[i];
//把值加入到頭節點後面,逆序建立鏈表
p->next = list->head->next;
list->head->next = p;
//鏈表節點個數加一
list->count++;
}
}
5.為了方便查看鏈表中的值,需要一個打印鏈表中的數據的函數
/************************************************
*功能:打印鏈表中的值
*參數:鏈表指針
*作者:Mr.li
*日期:14-07-23
************************************************/
void printList(List *list)
{
//臨時節點指針變量
Node *p;
//從頭開始遍歷
p = list->head->next;
while (p != NULL)
{
//自定義的輸出整的函數
print(p->data);
p = p->next;
}
putchar('\n');
}
6.查詢元素在鏈表中對於的位置
/************************************************
*功能:查找鏈表中指定值的位置,有的返還其位置,無,返還-1
*參數:鏈表指針,要查找的值
*作者:Mr.li
*日期:14-07-23
************************************************/
int search(List *list, int obj)
{
//定義游標指針
Node *p;
//標記值的位置
int local = 0;
p = list->head->next;
while (p != NULL)
{
local ++;
if (p->data == obj)
{
//返回值的位置
return local;
}
p = p->next;
}
//值不存在返回-1
return -1;
}
7.刪除鏈表中的相應的數據
/************************************************
*功能:刪除鏈表中的值
*參數:鏈表指針,要刪除的值
*作者:Mr.li
*日期:14-07-23
************************************************/
void delete(List *list, int obj)
{
//查詢要刪除的元素是否在鏈表中,有返還相應的位置,沒有則返還-1
int flag = search(list, obj);
//判斷值的合法性
if (flag == -1)
{
printf("沒有要刪除的值!\n");
}
else
{
//定義兩個輔助游標指針
Node *p, *q;
//給q,p賦值
q= list->head;
p = list->head->next;
//循環查找相應的值並刪除
while (p != NULL)
{
if (p->data == obj)
{
q->next = p->next;
p->next = NULL;
free(p);
break;
}
q = p;
p = p->next;
}
}
}
8.往鏈表中插入數據
/************************************************
*功能:往指定的位置後插入相應的值
*參數:鏈表指針,插入的位置,插入的值
*作者:Mr.li
*日期:14-07-23
************************************************/
void insert(List *list, int local, int number)
{
int count = 0;
//判斷值的合法性
if(count > list->count)
{
printf("你輸入的值不合法\n");
}
else
{
//定義游標指針,指向鏈表的頭結點
Node *p = list->head;
while (count != local) {
p++;
count++;
}
//分配新的結點並給新的結點賦值
Node *q = (Node *) malloc(sizeof(Node));
q->data = number;
q->next = NULL;
//插入新的結點
q->next = p->next;
p->next = q;
}
}
以上是小菜學習鏈表的代碼了,給大家分享一下!!
/*creat a list*/
#include "stdlib.h"
#include "stdio.h"
struct list
{ int data;
struct list *next;
};
typedef struct list node;
typedef node *link;
void main()
{ link ptr,head;
int num,i;
ptr=(link)malloc(sizeof(node));
ptr=head;
printf("please input 5 numbers==>\n");
for(i=0;i<=4;i++)
{
scanf("%d",&num);
ptr->data=num;
ptr->next=(link)malloc(sizeof(node));
if(i==4) ptr->next=NULL;
else ptr=ptr->next;
}
ptr=head;
while(ptr!=NULL)
{ printf("The value is ==>%d\n",ptr->data);
ptr=ptr->next;
}
}
上面是一個簡單的創建鏈表的C程序。所謂鏈表形象的講就是一個數據塊裡面存有數據,並且存有下一個數據的指針,這樣一個指一個形成一個數據鏈。這個數據鏈可以被操作,例如插入數據,刪除數據,等。至於指令,首先定義一個結構體,它存有數據和指向下一個數據塊的指針。然後分配空間。注意最後一個為NULL,當然你也可以指向開頭一個數據塊形成一個循環鏈表。
樓主你好。
鏈表是一種數據結構,而隊列是一種抽象的概念,就像棧一樣。
船是一個比較抽象的概念,具體實現有木船、鐵船等等。隊列好比是船,鏈表好比是造船的材料。
隊列可以用鏈表實現,也可以用動態數組實現,這個抽象的概念可以用各種具體的數據結構實現。
SQQUEUE的第一個元素elemtype *elem;其實是指向了一個數組,該數組中存儲著類型為elemtype的元素,然後front和rear就標識了隊首和隊尾元素對應的數組下標。
typedef struct _Point{
int x,y;
}Point;
#define elemtype Point//這個elemtype可以是任意你自己定義的結構,可以是結構體,也可以是簡單數據類型
elemtype array[10]={0};//這個是隊列的數據結構,在這裡是一個Point數組
SQQUEUE queue={0};
queue.elem=array;//這樣array中的元素就是queue中的元素了。
queue.front=queue.rear=queue.size=0;
你說的next指針是鏈表節點中的成員。你想想鏈表和鏈表節點間的區別。
typedef struct _ListNode{//這是鏈表節點
int x,y;//這是存儲的數據
struct _ListNode *next;
}ListNode;
typedef struct _List{//這是鏈表,這裡並不存儲next
ListNode* front,rear;
}List;
如果還不懂,可以追問我。