数据结构-C语言代码 day 2-单链表

1.链表的概念

单链表是一种链式存取的数据结构,,链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。以“结点的序列”表示的线性表称作线性链表(单链表),单链表是链式存取的结构。对于链表的每一个结点,我们使用结构体进行设计,其主要内容有:

数据结构-C语言代码 day 2-单链表_第1张图片

单链表结构特点

其中,DATA数据元素,可以为你想要储存的任何数据格式,可以是数组,可以是int,甚至可以是结构体(结构体套结构体);NEXT为一个指针,其代表了一个可以指向的区域,通常是用来指向下一个结点,链表的尾部NEXT指向NULL(空),因为尾部没有任何可以指向的空间了。

以下:单链表的创建, 添加, 插入, 删除.

下面为临摹老师的代码:

(1).创建链表

typedef struct LinkNode
{
	char data;
	struct LinkNode *next;
 } LNode,*LinkList,*NodePtr;

(2).建立头节点(初始化)

生成新结点作为头结点,用头指针指向头结点——头结点的指针域置空

数据结构-C语言代码 day 2-单链表_第2张图片

 头结点和头指针的区分:不管带不带头结点,头指针始终指向单链表的第一个结点,而头结点是带头结点的单链表中的第一个结点,结点内通常不存储信息。

LinkList initLinkList()
 {
 	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
 	tempHeader->data = '\0';
 	tempHeader->next = NULL;
 	return tempHeader;
 }

(3).输出当前链表

void printList(NodePtr paraHeader)
 {
 	NodePtr p = paraHeader->next;
 	while(p!=NULL)
 	{
 		printf("%c",p->data);
 		p = p->next;
	 }
	 printf("\r\n");
 }

(4).尾插法插入

 void appendElement(NodePtr paraHeader,char paraChar)
 {
 	NodePtr p,q;
 	
 	q = (NodePtr)malloc(sizeof(LNode));
 	q->data = paraChar;
 	q->next = NULL;
 	
 	p = paraHeader;
 	while(p->next!=NULL)
 	{
 		p = p->next;
	 }
	 
	 p->next = q;
  }

数据结构-C语言代码 day 2-单链表_第3张图片

(5).指定位置插入

 void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
  {
  	NodePtr p,q;
  	
  	p = paraHeader;
  	for(int i = 0;i < paraPosition;i++)
  	{
  		p = p->next;
  		if(p==NULL)
  		{
  			printf("The position %d is beyond the scope of the list.",paraPosition);
  			return;
		  }
	  }
	  
	  q=(NodePtr)malloc(sizeof(LNode));
	  q->data = paraChar;
	  
	  printf("linking\r\n");
	  q->next = p->next;
	  p->next = q;
  }

数据结构-C语言代码 day 2-单链表_第4张图片

(6).删除指定元素

 void deleteElement(NodePtr paraHeader,char paraChar)
  {
  	NodePtr p,q;
  	p = paraHeader;
  	while((p->next!=NULL)&&(p->next->data!=paraChar))
  	{
  		p=p->next;
	  }
	  
	  if(p->next==NULL)
	  {
	  	printf("Cannot delete %c\r\n",paraChar);
	  	return;
	  }
	  q=p->next;
	  p->next=p->next->next;
	  free(q);
  }

数据结构-C语言代码 day 2-单链表_第5张图片

 (7).测试

void appendInsertDeleteTest()
  {
	LinkList tempList = initLinkList();
	printList(tempList);

	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');
	printList(tempList);

	deleteElement(tempList, 'e');
	deleteElement(tempList, 'a');
	deleteElement(tempList, 'o');
	printList(tempList);

	insertElement(tempList, 'o', 1);
	printList(tempList);
  }

全部代码展示:

#include
#include

/**
*Linked list of characters.The key is data.
*/
typedef struct LinkNode
{
	char data;
	struct LinkNode *next;
 } LNode,*LinkList,*NodePtr;
 
 /**
 *Initialize the list with a header.
 *@return The pointer to the header.
 */
 LinkList initLinkList()
 {
 	NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
 	tempHeader->data = '\0';
 	tempHeader->next = NULL;
 	return tempHeader;
 }//Of initLinkList
 
 /**
 *Print the list.
 *@param paraHeaer The heaer of the list.
 */
 void printList(NodePtr paraHeader)
 {
 	NodePtr p = paraHeader->next;
 	while(p!=NULL)
 	{
 		printf("%c",p->data);
 		p = p->next;
	 }//of while
	 printf("\r\n");
 }//of printList
 
 /**
 *Add an element to the tail.
 *@param paraHeader The header of the list.
 *@param parachar The given char.
 */
 void appendElement(NodePtr paraHeader,char paraChar)
 {
 	NodePtr p,q;
 	
	 //step 1.Construct a new node.
 	q = (NodePtr)malloc(sizeof(LNode));
 	q->data = paraChar;
 	q->next = NULL;
 	
	 //step 2.search to the tail.
 	p = paraHeader;
 	while(p->next!=NULL)
 	{
 		p = p->next;
	 }//of while
	 
	 //step 3.Now add/link.
	 p->next = q;
  } //of appendElement
  
  /**
  *Insert an element to the given position.
  *@param paraHeader the header of the list.
  *@param paraChar the given char.
  *@param paraPosition the given position.
  */
  void insertElement(NodePtr paraHeader,char paraChar,int paraPosition)
  {
  	NodePtr p,q;
  	
  	//step 1.search to the position.
  	p = paraHeader;
  	for(int i = 0;i < paraPosition;i++)
  	{
  		p = p->next;
  		if(p==NULL)
  		{
  			printf("The position %d is beyond the scope of the list.",paraPosition);
  			return;
		  }//of if
	  }//of for i
	  
	  //step 2.construct a new node.
	  q=(NodePtr)malloc(sizeof(LNode));
	  q->data = paraChar;
	  
	  //step 3.Now link.
	  printf("linking\r\n");
	  q->next = p->next;
	  p->next = q;
  }//of insertElement
  
  /**
  *Delete an element from the list.
  *@param paraHeader the header of the list.
  *@param paraChar the given char.
  */
  void deleteElement(NodePtr paraHeader,char paraChar)
  {
  	NodePtr p,q;
  	p = paraHeader;
  	while((p->next!=NULL)&&(p->next->data!=paraChar))
  	{
  		p=p->next;
	  }//of while
	  
	  if(p->next==NULL)
	  {
	  	printf("Cannot delete %c\r\n",paraChar);
	  	return;
	  }//of it
	  q=p->next;
	  p->next=p->next->next;
	  free(q);
  }//of deleteElement
  
  /**
  *unit test.
  */
  void appendInsertDeleteTest()
  {
    // Step 1. Initialize an empty list.
	LinkList tempList = initLinkList();
	printList(tempList);

	// Step 2. Add some characters.
	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');
	printList(tempList);

	// Step 3. Delete some characters (the first occurrence).
	deleteElement(tempList, 'e');
	deleteElement(tempList, 'a');
	deleteElement(tempList, 'o');
	printList(tempList);

	// Step 4. Insert to a given position.
	insertElement(tempList, 'o', 1);
	printList(tempList);
  }// Of appendInsertDeleteTest

/**
* Address test: beyond the book.
*/
void basicAddressTest()
{
	LNode tempNode1, tempNode2;

	tempNode1.data = 4;
	tempNode1.next = NULL;

	tempNode2.data = 6;
	tempNode2.next = NULL;

	printf("The first node: %d, %d, %d\r\n",&tempNode1, &tempNode1.data, &tempNode1.next);
	printf("The second node: %d, %d, %d\r\n",&tempNode2, &tempNode2.data, &tempNode2.next);

	tempNode1.next = &tempNode2;
}// Of basicAddressTest

/**
 * The entrance.
 */
int main()
{
	appendInsertDeleteTest();
}// Of main

数据结构-C语言代码 day 2-单链表_第6张图片

 2.insertElement()函数更多测试

void appendInsertDeleteTest() {

	LinkList tempList = initLinkList();
	printList(tempList);


	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');

	//多加几个字符测试一下
	appendElement(tempList, '!');
	appendElement(tempList, '!');
	appendElement(tempList, '!');
	appendElement(tempList, 'S');
	appendElement(tempList, 'W');
	appendElement(tempList, 'P');
	appendElement(tempList, 'U');

	printList(tempList);


	deleteElement(tempList, 'U');
	deleteElement(tempList, 'P');
	deleteElement(tempList, 'S');
	deleteElement(tempList, 'W');


	deleteElement(tempList, 'A');
	printList(tempList);


	insertElement(tempList, 'o', 1);
	printList(tempList);
}

运行结果

数据结构-C语言代码 day 2-单链表_第7张图片

你可能感兴趣的:(数据结构,c语言,链表)