The advantage of list

链表的优点

       尽管一列数据可以存储在数组中,但是存储在链表中有更多的优点。特别是在要表示的数据元素的个数事先未知的情况下,链表就大有用武之地了,由于链表时动态变化的,所以,链表的长度可以根据需要增加或缩短。而对于数组二样,一旦内存分配完毕,数组的大小就不能改变了。为数组分配的存储空间在程序运行期间全部是被占用的,而链表只有在系统没有足够的内存空间来满足动态内存分配的要求时,才会出现全部内存空间都被占用的情况。

       链表的节点在内存中通常都不是连续存储的,但是在逻辑上,链表的节点是以连续的形式出现的。

       使用动态内存分配(而不是固定长度的数组)来实现数据结构在程序执行过程中增大或缩小,这能够节约内存空间。但是,引入的指针也要占用内存空间,同时,动态内存分配会带来额外的函数调用开销。

示例:

//operating and mainting a list

#include <stdio.h>

#include <stdlib.h>



//self-referential structure

struct listNode

{

char data;//each listNode contains a character

struct listNode *nextPtr;//pointer to next node

};



typedef struct listNode ListNode;//synonym for struct listNode

typedef ListNode *ListNodePtr;//synonym for ListNode



//prototypes

void insert(ListNodePtr *sPtr, char value);

char delete(ListNodePtr *sPtr, char value);

int isEmpty(ListNodePtr sPtr);

void printList(ListNodePtr currentPtr);

void instructions(void);



int main(void)

{

ListNodePtr startPtr = NULL;//initially there are no nodes

int choice;//user's choice

char item;//char entered by user



instructions();//display the menu

printf("? ");

scanf("%d",&choice);



//loop while user does not choose 3

while(choice != 3)

{

switch(choice)

{

case 1:

printf("Enter a character: ");

scanf("\n%c",&item);

insert(&startPtr,item);//insert item in list

printList(startPtr);

break;

case 2://delete an element

//if list is not empty

if(!isEmpty(startPtr))

{

printf("Enter character to be deleted: ");

scanf("\n%c",&item);



//if character is found , remove it

if(delete(&startPtr,item))//remove item

{

printf("%c deleted.\n",item);

printList(startPtr);

}

else

{

printf("%c not found.\n\n",item);

}

}

else

printf("List is empty.\n\n");

break;

default:

printf("Invalid choice.\n\n");

instructions();

break;

}



printf("? ");

scanf("%d",&choice);

}

printf("End of run.\n");



return 0;//indicates successful termination.

}



void instructions(void)

{

printf("Enter your choice: \n"

" 1 to insert an element into the list.\n"

" 2 to delete an element from the list.\n"

" 3 to end.\n");

}



void insert(ListNodePtr *sPtr, char value)

{

ListNodePtr newPtr;//pointer to new node

ListNodePtr previousPtr;//pointer to previous node in list

ListNodePtr currentPtr;//pointer to current node in list



newPtr = malloc(sizeof(ListNode));//create node



if(newPtr != NULL)//is space available

{

newPtr -> data = value;//place value in node

newPtr -> nextPtr = NULL;//node dose not link to another node



previousPtr = NULL;

currentPtr = *sPtr;



//loop to find the correct location in the list

while(currentPtr != NULL && value > currentPtr -> data)

{

previousPtr = currentPtr;//walk to

currentPtr = currentPtr -> nextPtr;//next node

}



if(previousPtr == NULL)

{

newPtr -> nextPtr = *sPtr;

*sPtr = newPtr;

}

else

{

previousPtr -> nextPtr = newPtr;

newPtr -> nextPtr = currentPtr;

}

}

else

{

printf("%c not inserted . No memory available.\n",value);

}

}



//delete a list emlement

char delete(ListNodePtr * sPtr, char value)

{

ListNodePtr previousPtr;

ListNodePtr currentPtr;

ListNodePtr tempPtr;



//delete first node

if(value == (*sPtr) -> data)

{

tempPtr = *sPtr;

*sPtr = (*sPtr)->nextPtr;

free(tempPtr);

return value;

}

else

{

previousPtr = *sPtr;

currentPtr = (*sPtr)->nextPtr;



//loop to find the correct location in the list

while(currentPtr != NULL && currentPtr->data != value)

{

previousPtr = currentPtr;

currentPtr = currentPtr -> nextPtr;

}



if(currentPtr != NULL)

{

tempPtr = currentPtr;

previousPtr -> nextPtr = currentPtr -> nextPtr;

free(tempPtr);

return value;

}

}

return '\0';

}



//return 1 if the list is empty, 0 otherwise

int isEmpty(ListNodePtr sPtr)

{

return sPtr == NULL;

}



void printList(ListNodePtr currentPtr)

{

if(currentPtr == NULL)

{

printf("List is empty.\n\n");

}

else

{

printf("The list is : \n");



while(currentPtr != NULL)

{

printf("%c --> ",currentPtr->data);

currentPtr = currentPtr->nextPtr;

}

printf("NULL\n\n");

}

}



clip_image002

string,list,tuple

列表. 元组和字典

       Python支持3中基本序列数据类型:字符串string、列表list和元组tuple

 

       列表存储的通常是同种数据的序列,相反,元组通常存储异种数据的序列但这只是一种习惯,而非规则。

       元组的每个数据项都提供了元组所表示的总体信息中的一部分,假定一个元组表示某个班的一名学生,元组中可能包含学生的姓名、年龄、地址等信息。

       元组长度是事先确定的,不可在程序执行期间更改

       所以列表和元组的主要区别在于:列表是可变的,元组则是不可变的。

 

       Python不允许程序员选择采用传值还是传引用。Python参数采用的是传对象引用的方式,即函数收到的是对作为参数传递的值的一个引用。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到对一个可变对象的引用,就能修改对象的原始值相当于通过传引用来传递对象,而如果函数收到对一个不可变对象的引用,函数就不能直接修改原始对象相当于通过传值来传递对象。

Python 列表

列表

       列表是一个任意类型的对象的位置相关的有序集合,它没有固定的大小,不像字符串,其大小是可变的,通过对偏移量进行赋值以及其他各种列表的方法进行调用,确实能够修改列表的大小。

       Python的列表与其他语言中的数组有些类似,但是列表要强大得多,其中一个方面就是,列表没有固定类型的约束

       我们可以使用append方法来扩充列表的大小,用pop方法移除给定的一项,用insert插入元素,用remove来移除元素。因为列表时可变的,大多数列表的方法都会改变列表对象,而不是创建一个新的列表。