线性表的基本操作:插入、删除、查找等操作在顺序存储结构和链接存储结构上的算法


          

 1次授课  授课时间2006322 3学时04541--542 教案完成时间 200625

 

课程名称

数据结构

专业名称

授课教师/职称

xxx

授课方式(合、小班)

 

授课题目(章、节)

 

教材及参考书目

张世和.数据结构.北京:清华大学出版社,2000.12.

 

教学目的与要求:

内容和时间安排、教学方法:

1  内容和时间安排:

2006.3.22

2.教学方法:

    上机实践

教学重点和难点:

1.重点:

2.难点:

 

复习思考题、作业题:

 

实施情况及分析:学生掌握了线性表结构的各种基本操作,情况正常。

 

      

辅助手段和时间分配

实验一

一、 实验目的
1、 掌握使用Turbo C或VC上机编写、调试数据结构程序的基本方法。
2、 掌握线性表的基本操作:插入、删除、查找等操作在顺序存储结构和链接存储结构上的算法及其实现方法。


二、 实验要求
1、 认真阅读和掌握本实验的程序。
2、 上机运行本程序,测试所有功能点。
3、 结合源程序分析运行结果。
4、 按照你对线性表的操作需要,加入新功能(例如合并表)并重新改写主程序。


三、 注意事项
在磁盘上创建一个目录,专门用于存储数据结构实验的程序。


四、 实验内容
以下为实现线性表基本操作的C源程序。
 /*

 *   线性表操作演示程序

 *

 *  authorSyman

 *  create: 2006-03-20

 */                             

#include <malloc.h>

#include <string.h>

#include <stdio.h>

 

#define MAX_LENGTH           256

 

int giListSize = 1;

//

// 链表中结点类型为以顺序表存储的字符串

typedef struct NODE

{

       char name[MAX_LENGTH];

       int last;

       struct NODE *next;

NODE;

//

// 打印链表中所有结点(一行一个)

void print_list(NODE *pListHead)

{

       NODE *pTemp = pListHead;

       while (pTemp) {

              printf("%s\n", pTemp->name);

              pTemp = pTemp->next;

       }

}

//

// 销毁链表

void destroy_list(NODE *pListHead)

{

       NODE **pNodes = (NODE**)malloc(giListSize*sizeof(NODE*));

       NODE *pTemp = pListHead;

       int i = 0;

       while (pTemp) {

              pNodes[i++] = pTemp;

              pTemp = pTemp->next;

       }

       for (i=(giListSize-1); i>=0; i--)

              free(pNodes[i]);

       free(pNodes);

}

//

// 插入一个字符到一个链表结点中

int insert_char(NODE *pNodeint ichar c)

{

       if (!pNode || i<1 || i>pNode->last+1 || pNode->last>=MAX_LENGTH)

              return 0;

 

       for (int m=pNode->lastm>=im--)

              pNode->name[m] = pNode->name[m-1];

       pNode->name[i-1] = c;

       pNode->last++;

       pNode->name[pNode->last] = '\0';

 

       return 1;

}

//

// 删除结点中的一个字符

int delete_char(NODE *pNodeint i)

{

       if (!pNode || i<1 || i>pNode->last || pNode->last==0)

              return 0;

      

       for (int m=im<pNode->lastm++)

              pNode->name[m-1] = pNode->name[m];

       pNode->last--;

       pNode->name[pNode->last] = '\0';

 

       return 1;

}

//

// 查找链表的第i个结点

NODE * get_node(NODE *pListHeadint i)

{

       int m;

       NODE *pResult = pListHead;

       if (!pResult || i<0)

              return NULL;

 

       for (m=0; m<i && pResultm++)

              pResult = pResult->next;

 

       return pResult;

}

//

// 插入一个结点到链表第i个结点之前

int insert_node(NODE *pListHeadchar *pNameint i)

{

       NODE *pTemp, *pNode = (NODE*)malloc(sizeof(NODE));

       if (!pListHead|| !pName || i<0 || !pNode)

              return 0;

 

       strcpy(pNode->namepName);

       pNode->last = strlen(pName);

 

       pTemp = get_node(pListHeadi-1);

       if (!pTemp)

              return 0;

 

       pNode->next = pTemp->next;

       pTemp->next = pNode;    

       giListSize++;

 

       return 1;

}

//

// 删除链表中的第i个结点

int delete_node(NODE *pListHeadint i)

{

       NODE *pTemp, *pNode;

       if (!pListHead|| i<0)

              return 0;

 

       pTemp = get_node(pListHeadi-1);

       if (!pTemp)

              return 0;

 

       pNode = pTemp->next;

       if (pNode) {

              pTemp->next = pNode->next;

              free(pNode);

       }

       giListSize--;

 

       return 1;

}

int con_node(NODE *pListHead,int j,int k)

{

       NODE *pTemp1,*pTemp,*pNode,*pTemp2 ;

       if (!pListHead|| j<0 ||k<0||j==k)

              return 0;

      

       pTemp1= get_node(pListHead, j);

    //char *c= pTemp1->name;

    pTemp2= get_node(pListHead, k);

       //char *d= pTemp2->name;

    strcat(pTemp1->name,pTemp2->name);

    delete_node(pListHead, k);

   return 1;

}

 

int main()

{

       int iChoiceiNIndexiCIndex;

       char cChar;

       char name[MAX_LENGTH];

       NODE *pTemp = NULL;

       //

       // 创建头结点

       NODE *pListHead = (NODE*)malloc(sizeof(NODE));

       if (!pListHead)

              return 0;

 

       strcpy(pListHead->name, "head");

       pListHead->last = 4;

       pListHead->next = NULL;

       //

       // 插入两节点,打印链表

       strcpy(name, "data");

       insert_node(pListHeadnamegiListSize);

       strcpy(name, "structure");

       insert_node(pListHeadnamegiListSize);      

       printf("\n******** 欢迎使用线性表操作演示程序! ********\n当前链表结点依次为:\n");

       print_list(pListHead);

       //

       // 功能演示

DEMO:

       printf("\n请按编号选择以下功能========>\n1.插入一个字符到一个结点中。\n2.删除一个结点中的字符。\n3.插入一个结点到链表中。\n4.删除链表中的一个结点。\n5.退出程序。\n<============================\n你的选择:");

       scanf("%d", &iChoice);

       switch (iChoice) {

       case 1: // 插入一个字符到一个结点中

              printf("请依次输入结点编号、字符插入位置与插入的字符:\n");

              scanf("%d %d %c", &iNIndex, &iCIndex, &cChar);

              pTemp = get_node(pListHeadiNIndex);

              insert_char(pTempiCIndexcChar);

              break;

       case 2: // 删除一个结点中的字符

              printf("请依次输入结点编号、欲删除字符的位置:\n");

              scanf("%d %d", &iNIndex, &iCIndex);

              pTemp = get_node(pListHeadiNIndex);

              delete_char(pTempiCIndex);

              break;

       case 3: // 插入一个结点到链表中

              printf("请依次输入欲插入结点的编号和名字:\n");

              scanf("%d %s", &iNIndexname);

              insert_node(pListHeadnameiNIndex);

              break;

       case 4: // 删除链表中的一个结点

              printf("请依次输入欲删除结点的编号:\n");

              scanf("%d", &iNIndex);

              delete_node(pListHeadiNIndex);

              break;

case 5

              printf("请输入两个结点的编号:\n");

              scanf("%d %d", &n,&m);

              con_node(pListHead,n,m);

              break;

       case 6 :退出程序

              goto EXIT;

       default:

              printf("\n无此项功能。\n");

              goto EXIT;

       }

 

       printf("\n当前链表结点依次为:\n");

       print_list(pListHead);

       goto DEMO;// 循环

 

EXIT:

       destroy_list(pListHead);

       printf("\n******** 感谢使用,下次再见!!! ********\n\n");

       return 1;

}

 

 

 

 

 

 

 

你可能感兴趣的:(c++)