您的位置:首页 > 其它

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

2016-07-28 09:07 766 查看
          
 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源程序。

 /*
 *   线性表操作演示程序
 *
 *  author:Syman
 *  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 *pNode, int i, char c)
{
       if (!pNode || i<1 || i>pNode->last+1
|| pNode->last>=MAX_LENGTH)
              return 0;
 
       for (int m=pNode->last; m>=i; m--)
              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 *pNode, int i)
{
       if (!pNode || i<1 || i>pNode->last || pNode->last==0)
              return 0;
      
       for (int m=i; m<pNode->last; m++)
              pNode->name[m-1] = pNode->name[m];
       pNode->last--;
       pNode->name[pNode->last] = '\0';
 
       return 1;
}
//
// 查找链表的第i个结点
NODE * get_node(NODE *pListHead, int i)
{
       int m;
       NODE *pResult = pListHead;
       if (!pResult || i<0)
              return NULL;
 
       for (m=0; m<i && pResult; m++)
              pResult = pResult->next;
 
       return pResult;
}
//
// 插入一个结点到链表第i个结点之前
int insert_node(NODE *pListHead, char *pName, int i)
{
       NODE *pTemp, *pNode = (NODE*)malloc(sizeof(NODE));
       if (!pListHead|| !pName || i<0 || !pNode)
              return 0;
 
       strcpy(pNode->name, pName);
       pNode->last = strlen(pName);
 
       pTemp = get_node(pListHead, i-1);
       if (!pTemp)
              return 0;
 
       pNode->next = pTemp->next;
       pTemp->next = pNode;    
       giListSize++;
 
       return 1;
}
//
// 删除链表中的第i个结点
int delete_node(NODE *pListHead, int i)
{
       NODE *pTemp, *pNode;
       if (!pListHead|| i<0)
              return 0;
 
       pTemp = get_node(pListHead, i-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 iChoice, iNIndex, iCIndex;
       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(pListHead, name, giListSize);
       strcpy(name, "structure");
       insert_node(pListHead, name, giListSize);      
       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(pListHead, iNIndex);
              insert_char(pTemp, iCIndex, cChar);
              break;
       case 2: // 删除一个结点中的字符
              printf("请依次输入结点编号、欲删除字符的位置:\n");
              scanf("%d %d", &iNIndex, &iCIndex);
              pTemp = get_node(pListHead, iNIndex);
              delete_char(pTemp, iCIndex);
              break;
       case 3: // 插入一个结点到链表中
              printf("请依次输入欲插入结点的编号和名字:\n");
              scanf("%d %s", &iNIndex, name);
              insert_node(pListHead, name, iNIndex);
              break;
       case 4: // 删除链表中的一个结点
              printf("请依次输入欲删除结点的编号:\n");
              scanf("%d", &iNIndex);
              delete_node(pListHead, iNIndex);
              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;
}
 
 
 
 
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: